not-tonight/docs/SPACES.md

9.0 KiB
Raw Permalink Blame History

NOT TONIGHT — Spaces Plan

How the game's two spaces grow from readable-but-abstract into places, using the fleet's asset factories. Written 2026-07-20. Code contract: everything lands behind data tables (venueMap.PROPS / LIGHTS) and a sprite drop-in convention — generated art replaces placeholders with zero code changes.

1. Design principles

  1. Darkness stays the mechanic. Props read as silhouettes in ambient dark and resolve under the torch. Nothing may make the room bright enough to scan from the doorway.
  2. Navigate by light signature. Each zone owns a colour of light, so the player orients by glow before geometry: bar = warm amber · dance floor = pulsing pink (on the actual beat) · DJ booth = deep blue · toilets = flickering green fluoro · smoking yard = cool rain-blue spill · entry/exit = venue pink. The torch is white; UV is purple. No other light sources.
  3. Props are data. PropDef { kind, tile pos, footprint, emissive? } — the renderer prefers a generated texture (gen:prop:<kind>) and falls back to a procedural placeholder, so the game is complete TONIGHT and gets prettier as art lands.
  4. Spaces anticipate the role ladder (design §6): the bar interior is laid out for a future bartender shift, the DJ booth for the DJ shift, the glassie station and smoking yard for floor loops that already have lanes speccing them.

2. The venue floor (80×45 tiles, one room + pockets)

┌──────────────────────────────────────────────────────────────────┐
│ N  ═ BAR ══════════ back-shelf glow          ┌─ DUNNIES ────────┐│
│    taps · till · glasses                     │ s1 s2 s3 s4      ││
│    ○○○○○○ stools                             │ sinks + mirror   ││
│                                              └───door───────────┘│
│ W                                                                 │
│ ┈entry┈  ┌ DANCE FLOOR (pulsing grid) ┐   ╔═ DJ BOOTH ╗    booths│
│ corridor │ speaker · · · · · speaker  │   ║ decks+mixer║        E│
│ posters  │  · · · disco ball · · ·    │   ║ (sealed)   ║   booths│
│ cloak    │ speaker · · · · · speaker  │   ╚════════════╝        │
│ glassie  └───────────────────────────┘                    booths│
│ station                                                          │
│    ▓ SMOKING YARD (open sky, rain) ▓   tables+candles     S     │
└────────▓ fence · butt bin ▓──────────────────────────────────────┘

Zone-by-zone (tile coords in venueMap.ts):

Zone What's there (props) Light signature Future role hook
Bar (north run) back-bar shelf (emissive), 3 beer taps, till, glass stacks steady amber pools along the shelf Bartender shift: the serving lane between bar tiles and shelf is already unwalkable-to-patrons
Dance floor (centre) 4 corner speaker stacks, disco ball (centre), floor grid cells pink grid cells pulse ON beat:tick; ball throws a slow-rotating glint DJ role reads crowd here
DJ booth (east of dance, sealed box facing the floor) 2 decks + mixer (from the 90sDJsim gear GLBs!), booth monitor, lamp deep blue wash + VU flicker The DJ shift's playable pocket
Booths (south + east walls) table per booth pair, candle tiny warm candle pools
Dunnies (NE walled room) sink row + mirror on west wall, hand dryer green fluoro, FLICKERS (torch almost redundant inside — deliberate)
Smoking yard (SW walled pocket, open sky) butt bin, milk crate seats, fence cool blue outdoor spill + rain particles INSIDE the yard FLOOR2's smoking loop (specced)
Entry corridor (west) poster wall (3 art slots — MODELBEAST posters!), cloakroom window, stamp podium venue-pink spill from the door UV re-entry checks happen here
Glassie station (bar's west end alcove) glass racks, tub trolley dim amber Glassie role's home base

Sim impact: walkability only changes where NEW walls go (DJ booth box, yard fence, sink row). All existing anchors keep working; reachability is asserted in tests. The yard gets a smoke anchor upgrade so wanderers actually go out for one.

3. The door street (640×360 tableau)

Already reads well. Two upgrades, both drop-in images (no layout change):

  1. Backdrop plate behind the existing rects: one wide pixel-art street wall (brick, posters, grime) — swaps in as gen:street:backdrop when generated.
  2. Kebab shop interior glow card in its window + rotating poster art in two street frames (same poster slots as the entry corridor).

4. The sprite drop-in contract (how John's art lands)

  • Drop processed PNGs in public/props/ named <kind>.png and list them in public/props/manifest.json ({"props": ["deck", "speaker", ...]}).
  • The floor loads the manifest at boot; anything listed replaces its placeholder (texture key gen:prop:<kind>). Missing = placeholder. No code changes.
  • tools/props_import.py (PIL, runs anywhere with python3+PIL — ultra has it) takes raw generated images → target pixel size + palette quantise + transparent background → writes public/props/ + updates the manifest: python3 tools/props_import.py incoming/deck_raw.png deck
  • Target sizes are in the script (TARGETS): hero props 4864 px, furniture 2432 px, small items 16 px. It refuses unknown kinds so typos can't ship.

5. GENERATION QUEUE — John's list (in priority order)

Pipelines: [MB] = MODELBEAST flux_local (params given) → drop raw output in art_incoming/, run the import script (or hand me the raws — either works). [GLB] = Blender ortho prerender of an existing fleet mesh (camera: orthographic, top-down 90° for floor props / front 0° for the street, transparent film, ~512px, neutral even lighting) → same import path.

# Item (kind) Pipeline & source Notes
1 deck [GLB] ultra:~/Documents/90sDJsim/web/world/models/gear/deck_t3_technics_sl_1200mk2.glb, top-down The hero. One render serves both booth decks
2 mixer [GLB] same dir, mixer.glb (or the urei once landed), top-down Sits between the decks
3 speaker [GLB] 90sDJsim models/props/ has boombox/speaker meshes; else [MB] prompt: "top-down view of a large black PA speaker stack, pixel art game sprite, dark background, viewed directly from above" 512×512 seed 4210 4 placements
4 discoball [MB] "mirrored disco ball seen directly from above, glinting, pixel art sprite, black background" 512×512 seed 4211 Centre of dance floor
5 barShelf [MB] "top-down bar back-shelf with glowing bottles rows, amber light, pixel art sprite, dark" 1024×256 seed 4212 Emissive — the amber source
6 taps [MB] "row of three beer taps on a bar counter viewed from above, pixel art, dark bg" 256×256 seed 4213
7 boothTable [MB] "small round pub table with two drinks seen from directly above, pixel art, dark bg" 256×256 seed 4214 6 placements
8 sink [MB] "public bathroom sink row with mirror viewed from above, green fluorescent light, pixel art, dark" 512×256 seed 4215
9 buttBin + crate [MB] one sheet: "outdoor smoking area props: cigarette butt bin and milk crate, top-down pixel art, dark bg" 512×256 seed 4216 Yard dressing
10 poster1..3 [MB] three runs: "grimy nightclub gig poster, 90s Australian pub rock / techno rave / missing cat, pixel art, portrait" 256×384 seeds 4217-19 FRONT view (posters hang on walls) — used at door + corridor
11 street:backdrop [MB] "wide pixel art night street wall: dark brick, torn posters, graffiti, neon reflections, rain, front-on orthographic, game background" 1600×440 seed 4220 The door scene plate. Biggest single visual win
12 cloak / glassRack [MB] "cloakroom window with hanging jackets / metal glass rack with stacked pint glasses, top-down pixel art, dark" 256×256 seeds 4221-22 Corridor + glassie station
13 arcade [GLB] m3ultra:~/Documents/procity/pipeline/_normalized/procity_fit_arcade_cabinet_01.glb, top-down Corner easter egg near entry

Ambition tier (later, not blocking): pre-rendered patron sprite sheets from the modular character kit + RIGROOM clips (Searching_Pockets, boxing pack, Leaning_Idle02_Smoking, zombie stagger for maggots) — replaces the procedural dolls entirely per docs/ASSETS.md §2. Wants its own session to set the palette/density once.

(flux params for all [MB] jobs: model flux2-klein-4b, steps 4; put "no text, no lettering" in every prompt EXCEPT the posters, where mangled text reads as authentic gig-poster grot.)