New bowlpoly element: the rim is a polygon, every vertex a draggable handle with its own depth slider. Inside/outside corners, hips, shallow-to-deep escalators and waterfall drops all come from the same continuous carve (IDW floor blend, quarter-pipe wall transition) — no seams by construction. Auto pool coping (bullnose tube, exported as grindable ledge segments per rim edge) and tile band baked into the ground texture. Ships parks/pool_demo.json (THE POOLROOM) as a premade showcase; ridden end-to-end in test mode. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.3 KiB
SKATEMAKER PRO — stand-alone park builder
The park editor for BOOKQUOY (and whatever comes after it). Born from bookquoy's one
rule: heightAt(x,z) is the single source of truth — the same element data drives the
editor viewport, the collision, the test ride, and the exported game level. Shape it in the
editor and it is the real thing.
Run it
python3 serve.py # http://localhost:8093
serve.py is static hosting plus the MODELBEAST proxy (token read from
~/Documents/backnforth/.env server-side — never shipped to the browser) and park/asset
persistence (parks/, assets/uploads/).
The editor
- TRANSITION — quarter (escalating radius, lump, vert extension), hip/corner quarter,
bank, kicker (tunable concavity), spine, roller/pump bump, mogul, volcano,
bowl (square pool or round), and the CUSTOM BOWL: a polygon pool where every rim
vertex is a draggable ball with its own depth slider. Inside corners = drag a vertex
in, hips = out, shallow-to-deep escalator = ramp the depths, waterfall = two close
vertices with different depths — one continuous carve, no seams by construction.
Auto pool coping (bullnose tube, exported as grindable ledge segments) and a
tile band baked into the ground texture. STREET — funbox, pyramid, ledge, wedge/manny pad
(inclined), stairs, island. Click a piece, click the ground. Drag to move,
[]rotate,Ddupe,⌫delete,⌘Zundo, optional 0.5m grid snap (THPS style). - STEEL — rails are polylines: flatbar, square bar, down rail, kink, double-kink,
rainbow, A-frame, pole jam, donkey kick — or draw your own (RAIL, two clicks) and
+ POINTfor kinks. Round pipe (with posts) or square angle-iron profile; every node is a draggable ball. Exports flatten to straight segments so bookquoy's grind detection needs zero changes. - PROPS — parametric street furniture: jersey barrier, picnic table, parking block, bench, trash can, hydrant, chain-link fence, floodlight, bleachers, shade sail, fountain, drain grate, fig tree. Make any prop grindable by drawing a ledge rail along its edge. (Overhangs — cradles, capsules, over-vert — aren't heightfield-able; those arrive as MODELBEAST GLB props.)
- SPOTS — named score gaps, B·O·O·K·Q·U·O·Y letters, spawn point.
- SURFACE — paint zones (rect/ellipse, any color), image decals (drop any image on the window, or generate one on the farm), and a reference underlay for tracing a real park from an aerial photo.
- MODELBEAST panel — browse farm assets, one-click PLACE any GLB as a park prop, use any farm image as a decal, GEN IMAGE (flux_local, ~9s), MAKE 3D (hunyuan3d_mlx image→GLB). Everything free and local on the m3ultra queue.
- PARK CHECK — live design linter encoding
docs/DESIGN_PRINCIPLES.md: pumping geometry, run-out clearance, crossing lines, skill tiering, buried/floating steel. - ▶ TEST RIDE (
Enter) — instant Create-A-Park-style build↔skate toggle with bookquoy's physics constants over the live data. W push, A/D steer, Space ollie.
Park format
parks/*.json — bounds, spawn, elements (parametric primitives evaluated by
js/parkmath.js), rails (polylines), gaps, letters, zones, decals, props,
optional underlay. Premade parks: parks/paddo.json (Paddington Skatepark ported from
bookquoy) and parks/pool_demo.json (THE POOLROOM — custom-bowl showcase, passes PARK
CHECK clean). Load them, ride them, remix them.
Export → BOOKQUOY
⬇ LEVEL.JS generates level.<name>.js exporting bookquoy's exact level.js contract
(heightAt, normalAt, BOUNDS, RAILS, GAPS, LETTERS, SPAWN, buildLevel). To ship a park:
- copy
js/parkmath.js+js/parkbuild.js+ the generatedlevel.<name>.jsintobookquoy/js/, and anyassets/uploads/files it references - point the two imports (
main.js,player.js) at the new level file
⬇ JSON downloads the raw park data; SAVE/LOAD… persist to parks/ on disk.
Lineage
- bookquoy (
../bookquoy) — the game this feeds; level 01 PADDO ~/Documents/thwk/THPS_STUDY.md— Neversoft architecture study (technique only, no extracted assets ever ship)- THPS Create-A-Park — inspiration for the palette/test-loop/themes/premade-parks shape