Ledger #4. Verified fresh Chromium seed 20261990. No new rng, goldens untouched. - Town-wide pools (venue.js): extended the R13 instanced-pool pass from venue frontages to EVERY streetlight + bus shelter. New townPoolSpecs(plan) replicates furniture.js's lamp cadence off the plan street graph (lamp every 18m from s=8, alternating sides, off=halfRoad+0.7) and reuses the exported busShelterStops(plan) -- read-only, furniture.js untouched (imported one function). All pools ride the ONE existing InstancedMesh -> still ~1 draw: 381 instances / 1 draw / ~760 tris. Night-driven; fog:true now so distant pools fade into night fog (pools aren't chunk-streamed) instead of floating as dots. Gig-gated -> ?classic=1 is pool-free = v2 parity by construction (no always-on furniture change, the v3.0 blocker). Deterministic cadence, no seeded draws (release law). - Default-boot re-baseline: measured the default content (gigs + weather=rain + winmap + tram all live), settled. Busiest venue block (pub, NIGHT, rain) ~157 scene / ~170 total draws, 66k tris; venue_night 122, queue_night 121, district_posters/street_noon 185 (worst tour shot), market_square fresh 97/52k. ALL <=300 draws / <=200k tris. Flip adds ~3 draws (rain 1 + tram 2; winmap 0), pools add ~0 (instanced). Daytime dense-citizen ceiling (~275, Lane D, live-walk) unchanged (pools night-only). - Bookmark spot-check: all 19 resolve, un-letterboxed, 0 errors under the default boot; rain+tram+winmap compose cleanly in old frames (street_noon rainy 177/114k, nothing blocked). No pose fixes. Ran before F's flip landed (out of the stated order): pools are gig-gated so they work under ?gigs now; re-baseline uses explicit all-flags URLs = post-flip default content. F re-confirms at close. -> Lane F (B->F handshake): default-boot busiest block ~170 total draws / 66k tris; worst street view 185 / 131k; densest daytime 97 / 52k. All under budget. Town-wide pools ~1 draw. Pool sprite is procedural (E has nothing to do). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| docs | ||
| pipeline | ||
| priorwork | ||
| tools | ||
| web | ||
| .gitignore | ||
| B-progress.md | ||
| C-progress.md | ||
| D-progress.md | ||
| E-progress.md | ||
| F-progress.md | ||
| README.md | ||
PROCITY
A standalone, procedurally generated, fully walkable 90s-Australian shopping town — every building enterable (the Vuntra City trick), every interior seeded and themed: record stores, op shops, toy shops, book barns, video rental, pawnbrokers, milk bars, market stalls. Built on the proven house stack (three.js r175 vendored, plain JS, no build step) and the asset DNA of 90sDJsim + thriftgod. v1 is the system; the GODVERSE/BaseGod real-item content plugs in later.
Run
cd web && python3 -m http.server 8130
# http://localhost:8130 (game shell — Lane B)
# http://localhost:8130/map.html (2D plan debugger — Lane A)
Read first
docs/CITY_SPEC.md— the treaty: schema, units, seeds, budgets, file ownership.docs/RESEARCH.md— what the parent repos already solved, with exact paths to port from.
The lanes (parallel Opus 4.8 sessions)
Each lane is a self-contained prompt. To run one, start an Opus session in this repo and say: "Read docs/LANES/LANE_X_….md and execute it." A–E are parallel-safe (disjoint files, standalone test pages); F integrates after they land.
| lane | mission | owns |
|---|---|---|
| A — CITYGEN | seed → CityPlan data (streets, blocks, lots, shops) + 2D map | js/citygen, js/core/registry.js, map.html |
| B — STREETSCAPE | chunk-streamed instanced 3D town + game shell | index.html, js/world |
| C — INTERIORS | every door opens: seeded themed shop interiors | js/interiors, interior_test.html |
| D — CITIZENS | rigged-near / impostor-far NPCs + shopkeepers | js/citizens, citizens_test.html, models/ |
| E — ASSETS | audit ultra's library, normalize GLBs, skins, manifest | pipeline/, assets/ |
| F — INTEGRATION | wire A–E into one seed-to-town game + QA gates | (after A–E) |
Already in the repo
web/vendor/— three.js r175 + addons (vendored from 90sDJsim; no CDN at runtime).web/assets/gen/— 69 generated texture skins (25 shopfront facades, 10 skies, 10 grounds, 8 wallpapers, 16 interior surfaces) inherited from thriftgod + 90sDJsim, style-locked.web/js/core/— frozen shared modules:prng.js(seeded-everything law),loaders.js(fail-soft promise-cached GLB/texture + 3GOD depot),canvas.js(text planes).
House laws (short form — CITY_SPEC has the fine print)
Seeded everything, Math.random banned in gen code · the game must run with zero assets ·
instancing from day one · canvas text, no font files · characters = shared base rigs + one
clip bank, canonical sources live outside this repo · 🟢 web-ok licensing only.
v3.0 — venues & gigs, THE DISTRICT (?gigs=1)
The Friday-night layer, shipped behind a flag so the default boot stays byte-identical to v2 (the
synthetic golden 0x3fa36874 never moves). Turn it on and each town seeds 2–4 venues — a pub, a
band room, an RSL — with a full seeded week of gigs (plan.gigs), town-wide posters, and a
Friday night that reads: a 4-piece band (front-line trio + drummer) with real instruments on the
stage, a mixed standing/dancing crowd, an outdoor queue at the door, a cover charge per
venue (paid & free nights), muffled gig spill through the wall + walla and applause inside,
streetlamp pools and lit frontages for the night walk, and identity continuity — the ped you
followed in off the street turns up in the crowd. Deterministic from the seed; asset-free
(?noassets=1) it all still happens with placeholders and zero fetches.
Flags (all default-off unless noted; compose freely):
| flag | what |
|---|---|
?seed=N |
town seed (default 20261990) |
?gigs=1 |
the v3.0 gig layer — venues, week schedule, band/crowd/queue, cover, posters, night pass |
?weather=rain · ?tram=1 · ?winmap=1 |
wet strip · tram loop · parallax interior-window shader |
?roster=stream |
chunk-streamed citizen density (on by default) · ?pop=N tunes it |
?dig=1 · ?stock=real |
crate-riffle on record bins · real GODVERSE sleeves in the stock |
?noassets=1 |
asset-free — zero network, 100% placeholders, still legible |
?plansrc=osm · ?mute=1 · ?dbg=1 |
OSM plan source · silence · the window.DBG capture/soak harness |
Release tour: docs/shots/release_v3/contact.html — the six money shots
(queue_night is the hero) with settled measurements. QA: tools/qa.sh --strict (6 gates) +
tools/qa/week_soak.py (the full-week soak) + the continuity/gig smokes in tools/flags_check.py.