# 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. Two arena styles, picked at dog select: - **⛰ Parkour** (side view) — gravity, wall-jumps, one-way platforms, blast-zone KOs. - **🐾 Dogpit** (top-down) — 8-way movement on a dota-style mirrored arena; hop (third axis) over saws, spikes and abyss pits; KO by knocking dogs into the void. 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 | Hop (top-down) | |---|---|---|---|---|---| | **P1** | WASD | F | G | H | Space | | **P2** | arrows | K | L | ; | , | - Side view: **↑/W** jumps (Space works too for P1), **↓** drops through one-way platforms - Top-down: **Space/,** hops over pits, saw blades, spikes and bites - **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 | Parkour (side) | Dogpit (top-down) | |---|---|---|---| | **Bolt** | Greyhound | Wall-slide/wall-jump, 8-way air dash | 8-way zoom dash on cooldown | | **Brick** | Bulldog | Charging ram, ground-pound shockwave | Same ram; slam down from a hop | | **Lasso** | Lurcher | Pendulum leash-swing, jump-release launch | Zip-leash: latch a wall, reel in, slingshot out | | **Wisp** | Saluki | Low gravity, double jump, blink through walls | Blink through walls and over pits | | **Stubbs** | Corgi | Jetpack, butt-bounce off hard landings | Hover — floats over pits, saws and spikes | All dogs keep their weight class: Brick barely launches, Wisp flies across the map. ## 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.