bookquoy/README.md
type-two 4f37adb4bd PS5 controller support: DualSense over Bluetooth via Gamepad API
js/pad.js synthesizes the same KeyboardEvents the keyboard produces —
one input path, zero new handler code. Stick/dpad steer (+variants),
R2 push, CROSS ollie, SQUARE/CIRCLE/TRIANGLE flip/heel/shove, R1 tre,
L1 fs shove, L2 hardflip, OPTIONS start, CREATE reset. Dual-rumble on
bails and bonks. Title screen: dpad cycles discipline, CROSS drops in
(Space now works there for keyboards too). Verified with a stubbed
DualSense through __step: push 7.6m/s, steer, ollie->kickflip x2 (220).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 22:26:34 +10:00

86 lines
4.2 KiB
Markdown

# BOOKQUOY — a brisbane sesh
Late nights in the park in Moorooka, someone yells **"BOOKQUOY!"** into the dark.
Friend or foe? A friend calls back **"BOOKQUOYORK!"** — and everything's sweet.
That's the game. Skate the parks of Brisbane, land tricks, hit the gaps, and collect
**B·O·O·K·Q·U·O·Y** — light all eight letters and the game calls back.
## Level 01: PADDO
Paddington Skatepark, 113 Caxton St (Neal Macrossan Park, opposite Suncorp) — Brisbane's
premier street park, stylised from the council upgrade plan and local park guides:
the looping island layout around the Moreton Bay figs, the fast **green concrete**, the
5ft square bowl in the west, the 6ft lumpy quarter at the south end, escalating
transitions on the walls, and the street plaza — funbox with rail combo, tiered
down-ledges, stairset with hubbas, long metal-capped ledge, P-rail, moguls with a
rainbow rail, and the spine.
Every surface rides on **one function**`heightAt(x,z)` in `js/level.js` is the single
source of truth for the visual mesh *and* the collision, so what you see is what you skate.
## Three disciplines
| | |
|---|---|
| **1 SKATE** | full trick bank: flips, varials, tre/laser, grinds on every rail and ledge |
| **2 BMX** | bunnyhop, barspin, double barspin, tailwhip, X-up |
| **3 BLADES** | same park, one catch: **locals throw rubbish at you.** Tradition. Dodge the cans or eat pavement to a chorus of "FRUIT BOOTS!!" |
## Controls
**Controller** (PS5 DualSense over Bluetooth, or any standard gamepad — press
any button after connecting so the browser picks it up):
```
left stick / dpad steer · up = push + up-variants · down = brake/varials
R2 push ✕ ollie / bunnyhop / hop off a grind
◻ kickflip|barspin ○ heelflip|tailwhip △ pop shove|x-up
R1 tre flip L1 fs shove L2 hardflip
OPTIONS start / run it back CREATE reset
```
Rumble on bails and bonks. On the title screen: dpad picks your discipline, ✕ drops in.
**Keyboard**
```
W / ↑ push SPACE ollie / bunnyhop / hop off a grind
A D / ← → steer S / ↓ brake
J kickflip | barspin K heelflip | tailwhip L pop shove | x-up
(hold ↑ or ↓ with J/K/L for varials + specials)
T tre flip Y laser H hardflip N impossible F fs shove
R reset to the tennis-court entrance ENTER start / run it back
```
Land on rails and ledges to grind. Chain tricks before the wheels settle to multiply.
2:00 on the clock. Named gaps (THE STAIR GAP, CAXTON CARVE, BOWL HIP…) pay 300 a pop.
## Run it
```bash
python3 serve.py 8141 # no-cache dev server
open http://localhost:8141
```
Textured trees + street furniture come from the **park_kit** sibling repo
(`monster/park_kit`, checked out next to this one — serve.py mounts it at
`/kit/`, or point `PARK_KIT=` elsewhere). Without it the park runs bare.
Parks built in **skatemakerpro** export a `level.<name>.js` with this exact
level.js contract and drop straight in.
## How it's built
- **three.js**, no engine, no bundler — plain ES modules.
- Characters + animation from the GODVERSE `character_kit`: the two-rig system
(rider rig + independently-animated board/bike rig), contact-solved with IK so feet
sit on the deck and hands hold the grips. Tricks are **data** (`js/tricks.js`) —
clip name + score — the design lesson taken from decompiling THUG's QB script tables.
- Physics owns the root; clips are cosmetic and in-place (the other THPS lesson).
- Trick clips carry their own pop, so the controller treats clip-time as air-time and
hands over to projectile physics only for drops.
Assets are original, license-clean, generated by the character_kit authoring tools.
Character: "raver" (Mixamo base, converted + normalized on m3ultra).
## Testing hooks
`window.__step(seconds)` advances the sim deterministically (the embedded browser pane
throttles rAF when hidden); `window.__tp(x, z, heading)` places the player; both exist
for headless verification and are harmless in play.
## Roadmap
- More Brisbane parks: Fairfield bowl? Bracken Ridge? Mt Gravatt snake run?
- Manuals + lip tricks, bail balance meter, session goals ("50-50 the Long Metal Ledge")
- BOOKQUOYORK multiplayer call-and-response (two players, one park?)