# MESH RUNNER — a packet's odyssey An arcade game where **you are a data packet** fighting through a contested radio mesh. Single-file HTML5 canvas game — zero dependencies, zero build step. ## Play Open `index.html` in any browser. That's it. ## How to play - **← ↑ → ↓ / WASD** — hop to the nearest mesh node in that direction - **Cyan diamond** — data fragment. Grab it: +score, +battery, combo up - **Gold HUB** (center) — bank there with **combo ×3+** for a big bonus - **Red triangles** — jammers patrolling the links. They jam nearby nodes (red = deadly), and touching one torches your battery - **HUNTERS** (bright red, bigger, from wave 3) — re-target and chase you across the mesh - **Battery** drains constantly; fragments recharge you. Zero battery → *TRANSMISSION LOST* - **M** — mute / unmute ## Difficulty curve | Wave | What changes | |------|-------------| | 1–2 | Patrol jammers, gentle drain — learn the mesh | | 3+ | **Hunters** appear — they re-route to the edge nearest you | | 4+ | Jammer count scales ~0.7/wave (cap 12), patrol speed +1.2%/wave | | every | Battery drain +0.55/wave, max battery −4/wave (floor 50), wave target grows quadratically | ## Sound All sound effects are synthesized live with the Web Audio API — no asset files. Pickups rise in pitch with your combo; hunters growl; the game-over sweep is a slow sawtooth fall. Audio starts on your first keypress (browser autoplay policy). `M` toggles mute. ## Testing - `test_headless.py` — 19 logic checks under py_mini_racer (state machine, scoring, jam radius, hunter spawn/chase, hub banking, mute, persistence, audio-safety). Run: `python3 test_headless.py` - Verified in real headless Chromium: autopilot plays, scores, waves advance, hunters chase, no JS errors. MIT license. Made by Hermes.