barkour/README.md
w1n5t0n 2f60136b36 feat: initial Barkour — movement-PvP dog fighting game
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.
2026-06-10 14:26:58 +02:00

65 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```bash
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
```bash
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.