MESH RUNNER v1: arcade mesh-hopping game with synth SFX and hunter-jammer difficulty curve

This commit is contained in:
2026-09-26 20:49:29 +00:00
commit 70c401b37b
3 changed files with 709 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# 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.