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.
65 lines
2.4 KiB
Markdown
65 lines
2.4 KiB
Markdown
# 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.
|