Level 01: Paddington Skatepark from the council plan + park guides — heightAt(x,z) single-source terrain, grindable rails/ledges, named gaps, B-O-O-K-Q-U-O-Y letters with the BOOKQUOYORK callback. SKATE / BMX / BLADES (blades cop thrown rubbish, as is tradition). character_kit two-rig banks: physics owns the root, clips are cosmetic. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
68 lines
3.3 KiB
Markdown
68 lines
3.3 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
|
|
```
|
|
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
|
|
```
|
|
|
|
## 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?)
|