5 dogs with distinct movement physics, seeded procedural arenas with traps and mineable powerups, smash-style knockback/stocks combat, local 2P and P2P netplay (PeerJS room keys), procedural art and sfx, headless sim smoke tests. |
||
|---|---|---|
| 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.