Sim: clamp knockback under tile size (wall tunneling), bomb/ball terminal velocity, grapple constraint no longer drags players into terrain, bite window ends on getting hit, shield/boost cleared on death, spawn invuln preserved through countdown, spike/saw events only on real damage. Mapgen: spawn footprint validation (was embedding dogs in 58% of seeds), saw paths rejected if they grind terrain or sweep spawns, towers no longer hang slabs over pits. Net: heartbeat+watchdog for dead peers, broker-error tolerance once P2P link is up, join/host reentrancy guards. UI: text-field keystrokes no longer hit game hotkeys, audio unlocks on mouse, textBaseline leak, snapshot carries onGround/landT so client dogs animate. |
||
|---|---|---|
| js | ||
| test | ||
| .gitignore | ||
| index.html | ||
| MAP.md | ||
| package.json | ||
| README.md | ||
| style.css | ||
BARKOUR 🐕💨
Dogfights × parkour. A 2-player movement-PvP fighting game: five dogs with wildly different movement physics brawl across procedurally generated arenas full of traps and mineable powerups. Last dog standing wins.
No build step, no game server, no asset files — everything (art, sound, maps) is generated procedurally in the browser.
Run it
npm run dev # python http.server on :8137
# → http://localhost:8137
Any static file server works (ES modules just need http://, not file://).
Play
| Move | Bite | Special | Item | |
|---|---|---|---|---|
| P1 | WASD | F | G | H |
| P2 | arrows | K | L | ; |
- ↑/W jumps, ↓ drops through one-way platforms
- Bite is also your mining pick — crack open crystals for powerups
- Damage % makes knockback grow (Smash-style); die by being launched past the arena edges or into the abyss. 3 stocks each.
- M mute, Esc pause/leave, Enter rematch
Online play (P2P)
One player clicks Host online room and shares the 5-letter key; the other clicks Join with room key. The PeerJS public cloud is used for signaling only — all game traffic flows directly peer-to-peer over a WebRTC data channel. No server of ours is involved. (Host is authoritative; the joiner streams inputs and renders snapshots.)
The dogs
| Dog | Breed | Movement identity |
|---|---|---|
| Bolt | Greyhound | Fastest runner, wall-slide/wall-jump, 8-way air dash |
| Brick | Bulldog | Massive knockback resistance, charging ram, ground-pound shockwave |
| Lasso | Lurcher | Leash grapple — anchor, reel, pendulum-swing, jump-release launch |
| Wisp | Saluki | Low gravity, double jump, blink-teleports through walls |
| Stubbs | Corgi | Jetpack (fuel refills on ground), butt-bounce off hard landings |
Arenas
Every match generates a fresh seeded arena: stepped terrain, abyss pits, wall-jump towers, floating islands, one-way platforms, spike patches, bounce pads, rail saws on patrol routes, and crystal outcrops. Mine crystals (or bomb them) for: tennis-ball launcher, bomb, shield, speed boost, heal. A care package also parachutes in periodically.
Tests
npm test # headless sim smoke test (node, no browser needed)
The sim core (js/sim.js + deps) is DOM-free by design: maps are seeded and
deterministic, matches run headlessly. See MAP.md for the code layout.