Compare commits
55 Commits
lane/conte
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ee4cf343b | ||
|
|
e0ead6698b | ||
|
|
67a5d8cf58 | ||
|
|
74cbd71ad3 | ||
|
|
7225eed349 | ||
|
|
22bd43857c | ||
|
|
4caa901df2 | ||
|
|
ae036d9d0e | ||
|
|
433bf77a78 | ||
|
|
9b6bc6355c | ||
|
|
9bc7dd1bfd | ||
|
|
195325f8f1 | ||
|
|
700bd48bcb | ||
|
|
fbc959fde8 | ||
|
|
3dd61fef36 | ||
|
|
754f2b4767 | ||
|
|
7af3732f39 | ||
|
|
4118a60aea | ||
|
|
0d3ce80c6b | ||
|
|
bcc06c104a | ||
|
|
3b8682dd40 | ||
|
|
6d2fc56bfb | ||
|
|
164b4480c5 | ||
|
|
79cd80dc01 | ||
|
|
d4f802407b | ||
|
|
ec9afaff0f | ||
|
|
e008fb442f | ||
|
|
5334a30150 | ||
|
|
5ebdfc61eb | ||
|
|
b7bb8f49ab | ||
|
|
022ea32005 | ||
|
|
c20a689086 | ||
|
|
b273c5c833 | ||
|
|
41e93d01ab | ||
|
|
fbcbb2e349 | ||
|
|
1b0842024b | ||
|
|
d8c3b0507d | ||
|
|
4471bf4376 | ||
|
|
389376c2f1 | ||
|
|
7803873825 | ||
|
|
f38ea0743c | ||
|
|
9827e4ebe6 | ||
|
|
b1e2f038bc | ||
|
|
2e0b1917b8 | ||
|
|
22f5f11dde | ||
|
|
7b44e01333 | ||
|
|
63a3b4d4fc | ||
|
|
a961e1853b | ||
|
|
662060388a | ||
|
|
df70c99dd0 | ||
|
|
e1972c1c07 | ||
|
|
10462ebada | ||
|
|
1a66c602fd | ||
|
|
906a366ba8 | ||
|
|
d112bda270 |
4
.gitignore
vendored
@ -1,2 +1,6 @@
|
|||||||
node_modules
|
node_modules
|
||||||
dist/
|
dist/
|
||||||
|
art_incoming/
|
||||||
|
public/props/manifest.lock
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|||||||
41
CLAUDE.md
@ -29,15 +29,44 @@ by parallel "lanes" coordinated through files, reviewed by Fable.
|
|||||||
branch. An unpushed session didn't happen.
|
branch. An unpushed session didn't happen.
|
||||||
- Remote is Gitea: `ssh://git@100.71.119.27:222/monster/not-tonight.git`.
|
- Remote is Gitea: `ssh://git@100.71.119.27:222/monster/not-tonight.git`.
|
||||||
|
|
||||||
|
## Dev notes (venue expansion landed 2026-07-28)
|
||||||
|
- **The ladder's four venues now have four different rooms** (`docs/VENUES.md`).
|
||||||
|
Layouts live in `src/scenes/floor/layouts/` (`theRoyal`, `elevate`, `room`);
|
||||||
|
**Voltage stays in `venueMap.ts`** so the others can import primitives from it
|
||||||
|
without an import cycle. A night picks its room from `NightContext.venue.id`.
|
||||||
|
- Nothing about a room may be a module singleton any more. Props, lights, posts,
|
||||||
|
probes and the tile palette all hang off `FloorLayout`. `venueMap.VENUE/PROPS/
|
||||||
|
LIGHTS` still exist and are still Voltage's — they are the reference room, not
|
||||||
|
"the venue".
|
||||||
|
- **Dev route `#floor:<venueId>`** boots the floor demo straight into one room
|
||||||
|
(`#floor:room`, `#floor:theRoyal`, `#floor:elevate`). Plain `#floor`/F = Voltage.
|
||||||
|
- `tests/floor/layoutInvariants.ts` is the executable rulebook every layout runs:
|
||||||
|
perimeter, reachability, anchors on walkable tiles, posts not sealed, probes
|
||||||
|
reachable, props on-grid. Add a room, add it to `LAYOUTS`, it gets checked.
|
||||||
|
- Asset generation is `tools/gen/` — `assets.py` is the manifest (one entry per
|
||||||
|
sprite), `run_batch.py` walks it, resumable, `--workers N`. **Cloudflare Workers
|
||||||
|
AI first** (10k free neurons/day, resets 00:00 UTC), falling back to MODELBEAST
|
||||||
|
`flux_local` automatically when the day's allocation is spent. Meshes use the
|
||||||
|
**512 tier + vertex baker** (`mb.FAST_MESH`): ~90s vs ~6min, and the difference
|
||||||
|
does not survive the downscale to 32px. Heartbeat: `~/.jobs/not-tonight-assets.json`.
|
||||||
|
- `props_import.py` takes its sizes FROM `tools/gen/assets.py`, so sizes cannot
|
||||||
|
drift between the farm and the game. It locks `manifest.json` — parallel imports
|
||||||
|
used to lose entries to a read-modify-write race, which shows up as a prop that
|
||||||
|
is on disk but renders as a placeholder. `tools/gen/rebuild_manifest.py` repairs.
|
||||||
|
|
||||||
## Dev notes (Phase 2 landed 2026-07-19)
|
## Dev notes (Phase 2 landed 2026-07-19)
|
||||||
- The game boots into the NIGHT (Thu→Fri→Sat run, saved). Controls: click the
|
- The game boots into the NIGHT (Thu→Fri→Sat run, saved). Controls: click the
|
||||||
rope/verdicts at the door; click the venue doorway to step inside; on the
|
rope/verdicts at the door; click the venue doorway to step inside; on the
|
||||||
floor WASD + E (E at the entry exits back to the door). While you're inside,
|
floor WASD + E (E at the entry exits back to the door). While you're inside,
|
||||||
Kayden works the door — badly, on purpose.
|
Kayden works the door — badly, on purpose.
|
||||||
- Dev routes: N night · P parade · F floor demo · J juice demo (+ same-named
|
- Dev routes: N night · P parade · F floor demo · J juice demo (+ same-named
|
||||||
URL hashes). `localStorage.removeItem('not-tonight-save')` for a clean run.
|
URL hashes) · M toggles the MIX DESK overlay anywhere (ear-pass rig).
|
||||||
|
`localStorage.removeItem('not-tonight-save')` for a clean run.
|
||||||
- Audio unlocks on first click (TechnoEngine + location filter). Before that a
|
- Audio unlocks on first click (TechnoEngine + location filter). Before that a
|
||||||
StubBeatClock keeps `beat:tick` honest.
|
StubBeatClock keeps `beat:tick` honest.
|
||||||
|
- Venue spaces/props/lights are DATA (`venueMap.PROPS`/`LIGHTS`, plan in
|
||||||
|
docs/SPACES.md). Generated art drops into `public/props/` via
|
||||||
|
`tools/props_import.py` + manifest — placeholders render until then.
|
||||||
|
|
||||||
## Dev notes (Phase 0, still true)
|
## Dev notes (Phase 0, still true)
|
||||||
- Gate: `npm run lint && npm run build && npm test` — all three must pass before
|
- Gate: `npm run lint && npm run build && npm test` — all three must pass before
|
||||||
@ -61,3 +90,13 @@ by parallel "lanes" coordinated through files, reviewed by Fable.
|
|||||||
The game is Aussie hospitality satire — affectionate, funny, with a moral undertow
|
The game is Aussie hospitality satire — affectionate, funny, with a moral undertow
|
||||||
(design doc §4.3). If content you're writing reads as mean-spirited rather than
|
(design doc §4.3). If content you're writing reads as mean-spirited rather than
|
||||||
absurd, soften toward absurd.
|
absurd, soften toward absurd.
|
||||||
|
|
||||||
|
## Deploy (live since 2026-07-19)
|
||||||
|
- Live at **https://monsterrobot.games/not-tonight/** (botchat VPS, forum-nginx
|
||||||
|
bind mount — host path `/home/humanjing/monsterrobot.games/games/not-tonight/`,
|
||||||
|
`/not-tonight` is a symlink to it; landing tile in `../index.html`).
|
||||||
|
- Ship: `npm run build && rsync -az --delete dist/ humanjing@100.71.119.27:/home/humanjing/monsterrobot.games/games/not-tonight/`
|
||||||
|
then cache-busted curl to verify. Hashed asset names make CF cache a non-issue;
|
||||||
|
index.html is text/html (uncached by CF default).
|
||||||
|
- Cover art: `covers/nottonight.jpg` + `_riso.jpg` (MODELBEAST flux_local seed
|
||||||
|
4208 + PIL stamp text/riso pass — recipe in LANEHANDOVER Phase-3 deploy note).
|
||||||
|
|||||||
1632
LANEHANDOVER.md
1
art_incoming/README.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
raw drops go here; process with tools/props_import.py
|
||||||
BIN
art_incoming/arcade.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
art_incoming/barShelf.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
art_incoming/boothTable.png
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
art_incoming/buttBin.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
art_incoming/cloak.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
art_incoming/crate.png
Normal file
|
After Width: | Height: | Size: 363 KiB |
BIN
art_incoming/deck.png
Normal file
|
After Width: | Height: | Size: 225 KiB |
BIN
art_incoming/discoball.png
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
art_incoming/glassRack.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
art_incoming/glassStack.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
art_incoming/mixer.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
art_incoming/poster1.png
Normal file
|
After Width: | Height: | Size: 823 KiB |
BIN
art_incoming/poster2.png
Normal file
|
After Width: | Height: | Size: 337 KiB |
BIN
art_incoming/poster3.png
Normal file
|
After Width: | Height: | Size: 562 KiB |
BIN
art_incoming/sinkRow.png
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
art_incoming/speaker.png
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
art_incoming/stampPodium.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
art_incoming/street_backdrop.png
Normal file
|
After Width: | Height: | Size: 944 KiB |
BIN
art_incoming/taps.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
art_incoming/till.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
@ -26,16 +26,42 @@ nike_air_max, moschino, quiksilver, kmart, disruptor_ii…), dynamically loaded
|
|||||||
sprites before committing — pixelated photo-sprites can look mushy; may need a
|
sprites before committing — pixelated photo-sprites can look mushy; may need a
|
||||||
cleanup pass or MODELBEAST-assisted redraw per sprite.
|
cleanup pass or MODELBEAST-assisted redraw per sprite.
|
||||||
|
|
||||||
### 2. Drunk/idle/dance animation references
|
### 2. RIGROOM — the character × animation factory (surveyed 2026-07-19)
|
||||||
`ultra:~/Documents/90sDJsim/web/world/models/` — 22 ped GLBs + **9 anim clip GLBs
|
**This supersedes the old "animation references" note. The fleet has a full
|
||||||
incl. `walk_drunk`, idle, sit** (from the shared `character_kit` rig). Plus
|
character/animation pipeline, live and organised:**
|
||||||
`ultra:~/Documents/MOTIONLIB/` — 2,703 motion/anim FBX.
|
- **RIGROOM library** (`ultra:~/meshgod-backups/library`, 2.4 GB): **607
|
||||||
- Option A (cheap): use `walk_drunk` etc. as *visual reference* for hand-animating
|
animation FBX** in themed packs + 59 character files. Web UI live at
|
||||||
the pixel sway/stumble frames.
|
`http://100.91.239.7:8010/rigroom` (characters × animations pairing, three.js
|
||||||
- Option B (pipeline): pre-render `character_kit` characters + MOTIONLIB clips to
|
preview, instant Mixamo-ready FBX download). CLI:
|
||||||
top-down sprite-sheet rotations for the Floor scene (Blender orthographic cam →
|
`MESHGOD/scripts/rigroom.py classify|sort|scan`.
|
||||||
pixelate). Heavier, but gives unlimited consistent NPC animation. Decide at v0.4;
|
- Clips that read like THIS game's shot list: `Searching_Pockets` (pat-down),
|
||||||
the doll contract's `floorTopDown` pose doesn't care which path wins.
|
`Standing_Arguing` + a full boxing/knockout pack (floor fights),
|
||||||
|
`Shaking_Head_No` (the deny), `Inspecting`/`Looking_Around` (ID check),
|
||||||
|
`Leaning_Idle02_Smoking` (smoking area), dozens of idles/sits, dance packs,
|
||||||
|
`Brutal To Happy Walking`, zombie stagger (maggot walk), 12 DJ motions.
|
||||||
|
Raw source: `m3ultra:~/Documents/Rokoko_Free_Mocap_FBX_263` (606 FBX).
|
||||||
|
- **Modular character kit** (`m3ultra:~/Documents/character_kit_modular`,
|
||||||
|
canonical `ultra:~/Documents/character_kit/modular/`): GODVERSE socket
|
||||||
|
standard — head/hands/feet/torso swap on one shared 65-bone `mixamorig:`
|
||||||
|
skeleton, 40 embedded actions, every library clip retargets for free.
|
||||||
|
- **repose** (`m3ultra:~/Documents/repose`): photo → T-pose views (SD1.5 +
|
||||||
|
ControlNet, all-local) → MeshGod multi-view → autorig. A face becomes a
|
||||||
|
rigged character without leaving the tailnet.
|
||||||
|
- **For NOT TONIGHT (v0.4 art pass), the pre-render path is now fully paved:**
|
||||||
|
modular kit character + RIGROOM clip → Blender orthographic top-down/front →
|
||||||
|
pixelate → sprite sheets behind the existing `renderDoll` poses. The outfit
|
||||||
|
variety could even come from kit part swaps. Same pipeline, one venue's
|
||||||
|
worth of NPC animation for free. Decide at v0.4; contracts don't move.
|
||||||
|
- Also present, unsurveyed depth: `MOCAPGOD` (empty queue — service scaffold),
|
||||||
|
`mixamo_upload` staging, `MOTIONLIB` (2,703 FBX, ultra) still the deep pool.
|
||||||
|
|
||||||
|
### 2b. procity (m3ultra) — the 90s-Aussie town sim
|
||||||
|
Walkable procedural shopping town (three.js, no build step), built by lanes
|
||||||
|
like ours. Pipeline: 186 GLB/FBX with fit/normalize/decimate tooling
|
||||||
|
(`procity_fit_*` props: arcade cabinet, clothes racks, shelving), 21 peds.
|
||||||
|
The **prop pipeline conventions** (batch manifests, decimation results JSON)
|
||||||
|
are the pattern to copy if NOT TONIGHT ever goes 3D-prop-assisted; the venue
|
||||||
|
furniture (bar, booths, stools) could come straight from its fit pipeline.
|
||||||
|
|
||||||
### 3. Venue / street reference art
|
### 3. Venue / street reference art
|
||||||
- `ultra:~/Documents/90sDJsim/web/world/media/` named scene/venue art — 100 wired
|
- `ultra:~/Documents/90sDJsim/web/world/media/` named scene/venue art — 100 wired
|
||||||
|
|||||||
91
docs/SCENARIOS.md
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# NOT TONIGHT — Character, Scenario & Interaction Backlog
|
||||||
|
|
||||||
|
*The idea shelf. Everything here obeys §4.3: choices cost something real, the
|
||||||
|
game never grades them, and the humane option is never secretly optimal.
|
||||||
|
Status: ✅ implemented · 🔜 next nibbles · 💡 backlog.*
|
||||||
|
|
||||||
|
## Interactions & mini-systems
|
||||||
|
|
||||||
|
- ✅ **The joint bust** (smoking yard). E on a smoker who smells herbal → three
|
||||||
|
verbs, none of them clean: **BIN IT** (by the book — write-up in the truth
|
||||||
|
log, smoker's night dampened), **POCKET IT** (the game's first corruption
|
||||||
|
verb — nothing happens now; maybe a Dazza sting later; and it sits in the
|
||||||
|
incident log waiting for the report form, where your account of it can be a
|
||||||
|
lie the audit remembers), **DIDN'T SEE IT** (the yard relaxes, vibe drifts
|
||||||
|
up… and it's still on the record as ignored). 'joint' is real contraband, so
|
||||||
|
it also turns up in pat-downs at the rope.
|
||||||
|
- ✅ **The glassie run** (the glassie role's fantasy, previewed as a floor
|
||||||
|
task). A wire rack of glasses appears at the bar's east end; carry it the
|
||||||
|
length of the venue to the kitchen dishwasher. Crowd bumps and sharp turns
|
||||||
|
build WOBBLE; wobble breaks glasses one smash at a time. Deliver what
|
||||||
|
survives for vibe. Racks keep coming. The door is unattended while you do it
|
||||||
|
— Kayden is thrilled.
|
||||||
|
- ✅ **ID passback detection** (2026-07-20): the same card twice in one night — the name on
|
||||||
|
the guest-list clipboard you already checked; second appearance of an
|
||||||
|
identical card = passback. Needs a "cards seen tonight" memory at the desk.
|
||||||
|
- ✅ **Regular step-up lines** (2026-07-20) keyed off timesDeniedBefore ("back again. new
|
||||||
|
moustache. no hard feelings").
|
||||||
|
- ✅ **Smoking-door slip-in** (2026-07-20) (FLOOR2 §2's second noStamp source).
|
||||||
|
- ✅ **The 1:30 lockout** (2026-07-20) (deeply Queensland): after 1:30 AM, admissions are
|
||||||
|
ILLEGAL. The queue still forms; Dazza still wants bodies; every post-lockout
|
||||||
|
admit is a guaranteed strike risk vs a rioting line. A whole late-game phase
|
||||||
|
in one law.
|
||||||
|
- ✅ **Vomit protocol** (2026-07-20): someone redecorates the dance floor → deploy the wet
|
||||||
|
floor sign (we own the prop) → slips if you dawdle; the glassie mop loop.
|
||||||
|
- ✅ **Phone confiscation** (2026-07-20): someone filming on the dance floor — the
|
||||||
|
influencer's revenge arc.
|
||||||
|
- ✅ **Water station duty** (2026-07-20) (RSA): press a cup on a `loose` patron; done right
|
||||||
|
it de-escalates the ripen timer. The humane tool that costs time.
|
||||||
|
- ✅ **First aid** (2026-07-20): a fainter. Recovery position via a QTE that is deliberately
|
||||||
|
NOT funny; the room hushes; the night resumes changed.
|
||||||
|
- ✅ **Kebab run** (2026-07-20): Dazza demands a kebab mid-slam. The shop is right there.
|
||||||
|
The queue can see you. The whole game in one errand.
|
||||||
|
|
||||||
|
## Characters (door archetypes & scripted people)
|
||||||
|
|
||||||
|
- ✅ **The off-duty cop** (2026-07-20) — flashes a badge at the rope. Real cop (deny freely,
|
||||||
|
he respects it; admit and he quietly reports the venue's breaches — a
|
||||||
|
walking inspector) or a $30 costume badge (the tells: hat, confidence,
|
||||||
|
wrong lanyard). The ID game's scariest bluff.
|
||||||
|
- ✅ **The celebrity incognito** (2026-07-20) — cap + sunnies (two live rule breaches!).
|
||||||
|
Deny: nothing happens, ever, and Dazza never finds out who. Admit: vibe
|
||||||
|
rocket OR pap swarm outside (aggro storm). You cannot know which.
|
||||||
|
- ✅ **The twins** (2026-07-20) — two people, one face, different names. Not a fake:
|
||||||
|
genuinely twins. Everything about the photo check is suddenly on trial.
|
||||||
|
- ✅ **The sovereign citizen** (2026-07-20) — "I don't recognise your dress code as having
|
||||||
|
authority over my person." Aggro engine in a polo. His ID is a laminated
|
||||||
|
business card.
|
||||||
|
- ✅ **The delivery rider** (2026-07-20) — insists the DJ ordered food. The DJ did not
|
||||||
|
order food. OR DID HE. (The booth lamp flickers hungrily.)
|
||||||
|
- ✅ **The promoter** (2026-07-20) — arrives with a roll of wristbands and 'his' guest list
|
||||||
|
that doesn't match yours. Two clipboards enter, one leaves.
|
||||||
|
- ✅ **The noise-complaint neighbour** (2026-07-20) — pyjamas, at the rope, at 1 AM, not
|
||||||
|
trying to get in: trying to get it turned DOWN. The only patron who wants
|
||||||
|
less club. Handle him badly and the inspector hears about it.
|
||||||
|
- ✅ **The hen's party, lost** (2026-07-20) — seven matching sashes, wrong venue, right
|
||||||
|
energy. Admitting them is a vibe grenade with a random timer.
|
||||||
|
- ✅ **The ex-doorman** (2026-07-20) — watches you work a patron, then tells you what you
|
||||||
|
missed (a live tutorial character; his tips are right ~80% of the time,
|
||||||
|
which is the joke).
|
||||||
|
|
||||||
|
## Systems worth a whole phase
|
||||||
|
|
||||||
|
- ✅ **Venue 4 / ROOM boss week** (2026-07-21, first cut): fourth rung on the
|
||||||
|
ladder (promotes from Elevate). No Dazza rule chronology — the board IS the
|
||||||
|
law and re-randomises every 15 in-game minutes (3 rules per window, seeded,
|
||||||
|
with a toast on the turn); every rope line renders as bracketed lip-read
|
||||||
|
guesses (`[FIST? LIST?]`) because the techno ate the dialogue. 60 licensed,
|
||||||
|
1.2 arrival scale, inspector working, crowd of heads and VIP-claimers.
|
||||||
|
- ✅ **The DJ shift** (2026-07-20, first cut): E at the booth hands you the decks
|
||||||
|
while the resident steps out. B pulls the bass (the room leans in); SPACE
|
||||||
|
drops, judged against the LIVE bar line (clean/late/clang — early and late
|
||||||
|
are the same offence); requests arrive at the booth glass with per-request
|
||||||
|
odds ("got any dnb", nan's song, the DUN DUN one) and three answers that all
|
||||||
|
cost something. A build held too long runs out of stairs. Movement locks
|
||||||
|
while you hold them; the floor and the door keep happening without you.
|
||||||
|
- ✅ **Bartender shift** (2026-07-21, first cut): E at the till hands you the
|
||||||
|
taps (movement locks; the floor keeps happening). Orders arrive as choices —
|
||||||
|
the order line degrades with the patron's stage (the spelling IS the sobriety
|
||||||
|
test) — SERVE / WATER / CUT OFF all legal, all priced. Serving messy/maggot
|
||||||
|
is the RSA breach: the vibe pays up front, and 35% of the time somebody with
|
||||||
|
a lanyard saw it (ONE deferred write-up per night, deduped by reason).
|
||||||
162
docs/SPACES.md
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
# 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.*
|
||||||
|
|
||||||
|
> **Superseded in part, 2026-07-28 — see [VENUES.md](VENUES.md).** This document
|
||||||
|
> describes ONE venue floor, which is what the game had when it was written. The
|
||||||
|
> venue ladder now has four distinct rooms, and props/lights/posts/probes hang
|
||||||
|
> off a per-venue `FloorLayout` rather than the module singletons named below.
|
||||||
|
> The pipeline sections (§4 sprite drop-in, and the settled prop pipeline at the
|
||||||
|
> foot of this file) are still exactly right and still the house rules — only
|
||||||
|
> "the venue floor" in §2 is now specifically *Voltage's* floor.
|
||||||
|
|
||||||
|
## 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 48–64 px, furniture
|
||||||
|
24–32 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.)*
|
||||||
|
|
||||||
|
|
||||||
|
## Prop pipeline — settled 2026-07-22 (A/B'd, not guessed)
|
||||||
|
|
||||||
|
Two routes, both free and unlimited on MODELBEAST. Pick by object, not by habit.
|
||||||
|
|
||||||
|
**[MB] flux direct** — `flux_local` → `tools/props_import.py`. Fast (~9s).
|
||||||
|
Use for FLAT things: posters, decals, graffiti, signage, floor markings.
|
||||||
|
|
||||||
|
**[GLB] TRELLIS → Blender** — `flux_local` (product shot) → `trellis2_mlx`
|
||||||
|
(`asset_id` is a TOP-LEVEL job field, NOT inside `params`) →
|
||||||
|
`tools/glb_to_sprite.py <mesh.glb> <kind>` → sprite + manifest, headless, no
|
||||||
|
GUI. Use for objects with real VOLUME: tables, fridges, machines, furniture.
|
||||||
|
|
||||||
|
Why the split, from the A/B (same pool table, both routes): flux picks its own
|
||||||
|
camera every generation — the same prompt style gave a perfectly top-down
|
||||||
|
urinal and a front-on fridge in one batch, and mismatched camera angles never
|
||||||
|
read as one room. The mesh route renders every prop from one fixed ortho
|
||||||
|
camera, and TRELLIS carries detail flux flattens: worn felt, real pockets,
|
||||||
|
rails and legs, clean alpha.
|
||||||
|
|
||||||
|
**RAKE by object HEIGHT — and I had this backwards first time.**
|
||||||
|
Low and wide (pool table, booth table, crate): **60°**. Tall (arcade, fridge,
|
||||||
|
speaker, anything standing): **~76°**. The instinct to *lower* the rake for tall
|
||||||
|
objects "so you see more face" is wrong — a tall object already shows nothing
|
||||||
|
but face; it needs to be steeper to read as a floor prop at all. A speaker at
|
||||||
|
55° is a featureless black slab.
|
||||||
|
|
||||||
|
**Judge sprites at SHIP size, not render size.** A 512px render of a fridge from
|
||||||
|
above looks ambiguous; the same sprite at 32x32 under the game's own point light
|
||||||
|
reads fine, because the venue's LIGHTS do half the identifying work (the fridges
|
||||||
|
carry a cyan glow, the arcade a flickering blue). Do not re-roll a prop off the
|
||||||
|
back of the big preview.
|
||||||
|
|
||||||
|
**The old guidance, kept because it is still true for low objects:** The venue's props are
|
||||||
|
three-quarter top-down, not straight down. Re-rolled from directly overhead, a
|
||||||
|
bar fridge is a grey rectangle — physically correct and visually dead, because
|
||||||
|
the glowing bottles that say "fridge" are on its front. 60° keeps the top
|
||||||
|
surface dominant while leaving enough face to identify the object at 32px.
|
||||||
150
docs/VENUES.md
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
# NOT TONIGHT — the four venues
|
||||||
|
|
||||||
|
*Written 2026-07-28. The venue ladder in `src/data/venues.ts` has always been
|
||||||
|
four venues; up to now they shared ONE floor map and differed only by difficulty
|
||||||
|
knobs. This document is the design contract for giving each its own room.*
|
||||||
|
|
||||||
|
## 0. Why bother
|
||||||
|
|
||||||
|
Design §6 sells the ladder as *promotion* — survive a week, get a better door.
|
||||||
|
But a promotion you cannot see is a number, not a reward. Walking into Elevate
|
||||||
|
and finding The Royal's carpet under your feet undoes the fiction the whole run
|
||||||
|
is built on. Each venue now has its own bar layout, its own dunnies, its own
|
||||||
|
smoking area and its own DJ booth, because those four things are exactly what a
|
||||||
|
bouncer actually learns about a room.
|
||||||
|
|
||||||
|
## 1. Shared contract (all four)
|
||||||
|
|
||||||
|
- **Grid is fixed at 80×45 tiles.** Venues differ by ARRANGEMENT, not extent —
|
||||||
|
the camera, minimap and bounds maths all key off `MAP_W`/`MAP_H`, and a
|
||||||
|
per-venue grid size would be a refactor with no visible payoff. A small venue
|
||||||
|
reads small by walling its unused grid to `void`, not by shrinking the array.
|
||||||
|
- **Every layout exports a `FloorLayout`**: `{ id, map, props, lights, posts,
|
||||||
|
probes }`. Nothing else may be a module singleton — that was the old shape and
|
||||||
|
it is what made four venues impossible.
|
||||||
|
- **Every layout must satisfy the same invariants** (`tests/floor/layouts.test.ts`):
|
||||||
|
1. every `AnchorKind` has ≥1 anchor, and every anchor is walkable;
|
||||||
|
2. all walkable tiles are mutually reachable (flood fill), except sealed
|
||||||
|
cubicle interiors, which must be reachable from their `StallDef.door`;
|
||||||
|
3. every `POSTS` entry is walkable and has a walkable neighbour (a post on a
|
||||||
|
sealed tile freezes the player for the night — this has shipped twice);
|
||||||
|
4. every `PROBES` entry has a walkable tile within reach;
|
||||||
|
5. no prop hangs off the grid.
|
||||||
|
- **Materials are grain, the palette is hue.** `FloorLayout.materials` names a
|
||||||
|
generated plate per tile kind (`tex_carpet`, `tex_concrete`, …) and the baker
|
||||||
|
stamps it **tinted to the palette colour**. That is deliberate: an untinted
|
||||||
|
photo-real plate blows straight past the brightness band everything else was
|
||||||
|
tuned in, and the room stops being dark. Plates are 16×16 — the game's tile —
|
||||||
|
because at that size "carpet" is structured noise, which is also what pub
|
||||||
|
carpet looks like from head height. No plate named, or art not landed: flat
|
||||||
|
palette colour, exactly as before.
|
||||||
|
- **The baked floor is keyed per venue** (`floor:tiles:<id>`). Textures outlive a
|
||||||
|
scene, so a single global key meant the first venue you played baked the floor
|
||||||
|
for every venue after it — you would survive a week at The Royal, get promoted,
|
||||||
|
and walk into Voltage still standing on the pub's carpet. It only shows on
|
||||||
|
promotion, which is precisely when the ladder is supposed to pay off.
|
||||||
|
- **Light signatures survive** (SPACES.md §1): bar = amber, dance = pulsing
|
||||||
|
pink on the real beat, DJ = deep blue, toilets = flickering green, smoking =
|
||||||
|
cool blue, entry = venue pink. A venue may add ONE signature colour of its
|
||||||
|
own — Elevate's skyline gold, ROOM's sodium orange — and no more, or the
|
||||||
|
navigate-by-glow rule stops working.
|
||||||
|
- **Darkness stays the mechanic.** No venue may be bright enough to scan from
|
||||||
|
the doorway.
|
||||||
|
|
||||||
|
## 2. The Royal — "a dive with a dance floor"
|
||||||
|
|
||||||
|
Licensed 80 · regulars and punters · nobody checks anything.
|
||||||
|
|
||||||
|
A suburban Australian pub that had a dance floor bolted on in about 2004 and has
|
||||||
|
not redecorated since. Patterned carpet, a horseshoe public bar, and the dance
|
||||||
|
floor is plainly the least important thing in the building.
|
||||||
|
|
||||||
|
| Space | What's in it |
|
||||||
|
|---|---|
|
||||||
|
| **Public bar** (horseshoe, west) | the long counter, taps, till, keg stack, a TV showing the footy, bar fridges |
|
||||||
|
| **Pool room** (north-west) | two pool tables, cue rack, a dartboard on the wall |
|
||||||
|
| **TAB / pokies corner** (north-east) | bank of poker machines, TAB screens, stools, its own miserable light |
|
||||||
|
| **Bistro** (centre-north) | bistro tables, bain-marie counter, the meat-raffle drum |
|
||||||
|
| **Dance floor** (south-east) | small, an afterthought, one mirror ball, a jukebox on the wall |
|
||||||
|
| **DJ corner** | not a booth — a folding table with a controller, beside the dance floor |
|
||||||
|
| **Dunnies** (east) | a stainless TROUGH, two cubicles (one out of order), one basin |
|
||||||
|
| **Beer garden** (south, open sky) | picnic tables, umbrellas, patio heater, butt bin — the smoking area, and the nicest room in the pub |
|
||||||
|
|
||||||
|
Light: warm amber everywhere, green cone over each pool table, the pokies' own
|
||||||
|
sickly blue, and the beer garden cool blue. No pink except the dance corner.
|
||||||
|
|
||||||
|
## 3. Voltage — "valley institution"
|
||||||
|
|
||||||
|
Licensed 110 · the tuning baseline · the inspector drinks here.
|
||||||
|
|
||||||
|
**This is the existing map and it does not change.** It is tuned under the
|
||||||
|
darkness sheet, its reachability is asserted, and every existing floor test
|
||||||
|
targets it. It stays the default layout and the reference for the other three.
|
||||||
|
|
||||||
|
## 4. Elevate — "rooftop, small room, big opinions"
|
||||||
|
|
||||||
|
Licensed 70 · influencers and owner's mates · every second person is a VIP.
|
||||||
|
|
||||||
|
The whole venue is outdoors, which makes the rain a design element rather than a
|
||||||
|
yard-only effect. Small footprint — a third of the grid is sky. You arrive by
|
||||||
|
lift, not off the street, so the entry is a lobby.
|
||||||
|
|
||||||
|
| Space | What's in it |
|
||||||
|
|---|---|
|
||||||
|
| **Lift lobby** (west) | lift doors, a rope line, the stamp podium, one mirror |
|
||||||
|
| **Cocktail bar** (north) | short backlit bar, no taps — bottles and a champagne bucket |
|
||||||
|
| **VIP booths** (east) | banquettes behind velvet rope posts, low tables |
|
||||||
|
| **Dance floor** (centre, small) | it is a terrace with a dance floor, not a club |
|
||||||
|
| **DJ plinth** | raised, open, no booth walls — the DJ is on display |
|
||||||
|
| **Toilets** (north-east) | two unisex cubicles, marble basin, enormous mirror |
|
||||||
|
| **Terrace edge** (south + east) | glass balustrade, planters, the city skyline beyond |
|
||||||
|
| **Smoking** | the whole roof is open air; a designated corner with a standing ash urn and heat lamps |
|
||||||
|
|
||||||
|
Light: warm amber bar, cool blue-white terrace, deep blue DJ, and the venue's
|
||||||
|
own signature — **skyline gold** spilling from the city card beyond the glass.
|
||||||
|
|
||||||
|
## 5. ROOM — "no sign, no socials"
|
||||||
|
|
||||||
|
Licensed 60 · heads and chancers · the board is the law.
|
||||||
|
|
||||||
|
A concrete warehouse. No branding anywhere, because branding is how you get
|
||||||
|
found. The sound system is the most expensive thing in the building by an order
|
||||||
|
of magnitude and everything else is borrowed.
|
||||||
|
|
||||||
|
| Space | What's in it |
|
||||||
|
|---|---|
|
||||||
|
| **Main floor** | concrete pillars, no booths, the crowd is the furniture |
|
||||||
|
| **The stacks** | Funktion-One-style speaker towers + subs — huge, four corners |
|
||||||
|
| **DJ booth** | low, central, facing the floor, no barrier — CDJs not turntables |
|
||||||
|
| **Bar** (west) | a plywood plank on scaffolding, cans only, no taps, no till |
|
||||||
|
| **Toilets** (north-east) | industrial, graffiti on every surface, three cubicles of which one works, a cracked basin, no mirror |
|
||||||
|
| **Loading dock** (south, open sky) | roller door, pallets, a wheelie bin — this is the smoking area |
|
||||||
|
| **Chill-out** (north-west) | two ruined couches under a single bulb |
|
||||||
|
| **The board** | the rule board that rewrites itself (`shuffleDressCode`) — a physical prop by the entry |
|
||||||
|
|
||||||
|
Light: almost none. Sodium orange over the loading dock (ROOM's signature),
|
||||||
|
one flickering green fluoro in the dunnies, strobes on the floor, and the
|
||||||
|
stacks' own power LEDs. This is the darkest venue in the game on purpose.
|
||||||
|
|
||||||
|
## 6. Prop vocabulary added for these rooms
|
||||||
|
|
||||||
|
Route per SPACES.md §"Prop pipeline": **[F]** = flux direct (flat things —
|
||||||
|
signage, boards, screens, backdrops); **[M]** = product shot → TRELLIS.2 →
|
||||||
|
Blender ortho render (things with volume). Rake follows the house rule —
|
||||||
|
**60° low and wide, ~76° tall**.
|
||||||
|
|
||||||
|
| Venue | Kinds |
|
||||||
|
|---|---|
|
||||||
|
| The Royal | `pokie`[M76] `tabBoard`[F] `bistroTable`[M60] `picnicTable`[M60] `trough`[M70] `keg`[M76] `dartboard`[F] `jukebox`[M76] `raffleDrum`[M60] `bainMarie`[M60] `tvSport`[F] `beerUmbrella`[M80] `ashtray`[M60] |
|
||||||
|
| Elevate | `cocktailBar`[M60] `banquette`[M60] `ropePost`[M76] `planter`[M60] `balustrade`[M76] `djPlinth`[M60] `marbleSink`[M70] `ashUrn`[M76] `champBucket`[M60] `loungeChair`[M60] `liftDoor`[F] `skylineCard`[F] |
|
||||||
|
| ROOM | `stackF1`[M76] `subBass`[M60] `plywoodBar`[M60] `rollerDoor`[F] `pallet`[M60] `wheelieBin`[M76] `oldCouch`[M60] `pillar`[M76] `ruleBoard`[F] `strobe`[M76] `smokeMachine`[M60] `cableSnake`[M60] `brokenBasin`[M70] `canStack`[M60] `cdj`[M60] |
|
||||||
|
| Staff (set dressing, all venues) | `staffBartender` `staffDj` `staffGlassie` `staffSecurity` — all [M76] |
|
||||||
|
|
||||||
|
Staff figures are PROPS, not patrons. The procedural dolls stay exactly as they
|
||||||
|
are: `dollPlan` draws the specific items the dress code convicts on, so
|
||||||
|
replacing patrons with pre-rendered art would make the convictions invisible
|
||||||
|
(recorded in LANEHANDOVER, FABLE-SOLO-23). A bartender who never moves is set
|
||||||
|
dressing and carries no mechanical weight, which is why she can be a sprite.
|
||||||
|
|
||||||
|
Street plates (door scene, one per venue, [F], 640×176):
|
||||||
|
`street:royal` `street:elevate` `street:room` — `street:backdrop` stays Voltage's.
|
||||||
BIN
public/props/arcade.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/props/ashUrn.png
Normal file
|
After Width: | Height: | Size: 609 B |
BIN
public/props/ashtray.png
Normal file
|
After Width: | Height: | Size: 608 B |
BIN
public/props/bainMarie.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/props/balustrade.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/props/banquette.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/props/barFridge.png
Normal file
|
After Width: | Height: | Size: 878 B |
BIN
public/props/barShelf.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
public/props/barrier.png
Normal file
|
After Width: | Height: | Size: 628 B |
BIN
public/props/beerUmbrella.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/props/binRound.png
Normal file
|
After Width: | Height: | Size: 457 B |
BIN
public/props/bistroTable.png
Normal file
|
After Width: | Height: | Size: 417 B |
BIN
public/props/boothLamp.png
Normal file
|
After Width: | Height: | Size: 424 B |
BIN
public/props/boothTable.png
Normal file
|
After Width: | Height: | Size: 781 B |
BIN
public/props/brokenBasin.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/props/buttBin.png
Normal file
|
After Width: | Height: | Size: 571 B |
BIN
public/props/cableSnake.png
Normal file
|
After Width: | Height: | Size: 981 B |
BIN
public/props/canStack.png
Normal file
|
After Width: | Height: | Size: 611 B |
BIN
public/props/carpet.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/props/cctv.png
Normal file
|
After Width: | Height: | Size: 524 B |
BIN
public/props/cdj.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/props/ceilingFan.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/props/champBucket.png
Normal file
|
After Width: | Height: | Size: 670 B |
BIN
public/props/cloak.png
Normal file
|
After Width: | Height: | Size: 691 B |
BIN
public/props/cocktailBar.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/props/crate.png
Normal file
|
After Width: | Height: | Size: 746 B |
BIN
public/props/cubicleDoor.png
Normal file
|
After Width: | Height: | Size: 379 B |
BIN
public/props/cueRack.png
Normal file
|
After Width: | Height: | Size: 438 B |
BIN
public/props/dartboard.png
Normal file
|
After Width: | Height: | Size: 592 B |
BIN
public/props/deck.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/props/discoball.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/props/dishwasher.png
Normal file
|
After Width: | Height: | Size: 832 B |
BIN
public/props/distroBox.png
Normal file
|
After Width: | Height: | Size: 396 B |
BIN
public/props/djPlinth.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/props/exitSign.png
Normal file
|
After Width: | Height: | Size: 424 B |
BIN
public/props/fireExt.png
Normal file
|
After Width: | Height: | Size: 523 B |
BIN
public/props/fireHose.png
Normal file
|
After Width: | Height: | Size: 478 B |
BIN
public/props/firepit.png
Normal file
|
After Width: | Height: | Size: 930 B |
BIN
public/props/flightCase.png
Normal file
|
After Width: | Height: | Size: 796 B |
BIN
public/props/front_elevate.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/props/front_room.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/props/front_theRoyal.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/props/front_voltage.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/props/glassRack.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/props/glassStack.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/props/graffiti.png
Normal file
|
After Width: | Height: | Size: 853 B |
BIN
public/props/handDryer.png
Normal file
|
After Width: | Height: | Size: 425 B |
BIN
public/props/highTable.png
Normal file
|
After Width: | Height: | Size: 223 B |
BIN
public/props/iceWell.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
public/props/jukebox.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/props/kebabShop.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/props/keg.png
Normal file
|
After Width: | Height: | Size: 668 B |
BIN
public/props/liftDoor.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/props/loungeChair.png
Normal file
|
After Width: | Height: | Size: 611 B |
131
public/props/manifest.json
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
{
|
||||||
|
"props": [
|
||||||
|
"arcade",
|
||||||
|
"ashUrn",
|
||||||
|
"ashtray",
|
||||||
|
"bainMarie",
|
||||||
|
"balustrade",
|
||||||
|
"banquette",
|
||||||
|
"barFridge",
|
||||||
|
"barShelf",
|
||||||
|
"barrier",
|
||||||
|
"beerUmbrella",
|
||||||
|
"binRound",
|
||||||
|
"bistroTable",
|
||||||
|
"boothLamp",
|
||||||
|
"boothTable",
|
||||||
|
"brokenBasin",
|
||||||
|
"buttBin",
|
||||||
|
"cableSnake",
|
||||||
|
"canStack",
|
||||||
|
"carpet",
|
||||||
|
"cctv",
|
||||||
|
"cdj",
|
||||||
|
"ceilingFan",
|
||||||
|
"champBucket",
|
||||||
|
"cloak",
|
||||||
|
"cocktailBar",
|
||||||
|
"crate",
|
||||||
|
"cubicleDoor",
|
||||||
|
"cueRack",
|
||||||
|
"dartboard",
|
||||||
|
"deck",
|
||||||
|
"discoball",
|
||||||
|
"dishwasher",
|
||||||
|
"distroBox",
|
||||||
|
"djPlinth",
|
||||||
|
"exitSign",
|
||||||
|
"fireExt",
|
||||||
|
"fireHose",
|
||||||
|
"firepit",
|
||||||
|
"flightCase",
|
||||||
|
"front_elevate",
|
||||||
|
"front_room",
|
||||||
|
"front_theRoyal",
|
||||||
|
"front_voltage",
|
||||||
|
"glassRack",
|
||||||
|
"glassStack",
|
||||||
|
"graffiti",
|
||||||
|
"handDryer",
|
||||||
|
"highTable",
|
||||||
|
"iceWell",
|
||||||
|
"jukebox",
|
||||||
|
"kebabShop",
|
||||||
|
"keg",
|
||||||
|
"liftDoor",
|
||||||
|
"loungeChair",
|
||||||
|
"marbleSink",
|
||||||
|
"mirror",
|
||||||
|
"mixer",
|
||||||
|
"monitor",
|
||||||
|
"mopBucket",
|
||||||
|
"noticeBoard",
|
||||||
|
"oldCouch",
|
||||||
|
"pallet",
|
||||||
|
"patioHeater",
|
||||||
|
"picnicTable",
|
||||||
|
"pieWarmer",
|
||||||
|
"pillar",
|
||||||
|
"plant",
|
||||||
|
"planter",
|
||||||
|
"plywoodBar",
|
||||||
|
"pokie",
|
||||||
|
"poolTable",
|
||||||
|
"poster1",
|
||||||
|
"poster2",
|
||||||
|
"poster3",
|
||||||
|
"poster4",
|
||||||
|
"poster5",
|
||||||
|
"poster6",
|
||||||
|
"poster7",
|
||||||
|
"poster8",
|
||||||
|
"poster9",
|
||||||
|
"raffleDrum",
|
||||||
|
"rollerDoor",
|
||||||
|
"ropePost",
|
||||||
|
"ruleBoard",
|
||||||
|
"sandwichBoard",
|
||||||
|
"sinkRow",
|
||||||
|
"skylineCard",
|
||||||
|
"smokeMachine",
|
||||||
|
"speaker",
|
||||||
|
"stackF1",
|
||||||
|
"staffBartender",
|
||||||
|
"staffChef",
|
||||||
|
"staffCleaner",
|
||||||
|
"staffDj",
|
||||||
|
"staffGlassie",
|
||||||
|
"staffSecurity",
|
||||||
|
"stampPodium",
|
||||||
|
"stanchion",
|
||||||
|
"streetBin",
|
||||||
|
"streetLamp",
|
||||||
|
"street_backdrop",
|
||||||
|
"street_elevate",
|
||||||
|
"street_room",
|
||||||
|
"street_theRoyal",
|
||||||
|
"strobe",
|
||||||
|
"subBass",
|
||||||
|
"tabBoard",
|
||||||
|
"taps",
|
||||||
|
"taxi",
|
||||||
|
"tex_brick",
|
||||||
|
"tex_carpet",
|
||||||
|
"tex_concrete",
|
||||||
|
"tex_deck",
|
||||||
|
"tex_looTile",
|
||||||
|
"tex_parquet",
|
||||||
|
"tex_paving",
|
||||||
|
"tex_plaster",
|
||||||
|
"tex_steel",
|
||||||
|
"tex_timber",
|
||||||
|
"till",
|
||||||
|
"topiary",
|
||||||
|
"trough",
|
||||||
|
"truss",
|
||||||
|
"tvSport",
|
||||||
|
"urinal",
|
||||||
|
"wetFloor",
|
||||||
|
"wheelieBin"
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
public/props/marbleSink.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/props/mirror.png
Normal file
|
After Width: | Height: | Size: 893 B |
BIN
public/props/mixer.png
Normal file
|
After Width: | Height: | Size: 918 B |
BIN
public/props/monitor.png
Normal file
|
After Width: | Height: | Size: 351 B |
BIN
public/props/mopBucket.png
Normal file
|
After Width: | Height: | Size: 432 B |
BIN
public/props/noticeBoard.png
Normal file
|
After Width: | Height: | Size: 884 B |
BIN
public/props/oldCouch.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/props/pallet.png
Normal file
|
After Width: | Height: | Size: 888 B |
BIN
public/props/patioHeater.png
Normal file
|
After Width: | Height: | Size: 619 B |
BIN
public/props/picnicTable.png
Normal file
|
After Width: | Height: | Size: 948 B |
BIN
public/props/pieWarmer.png
Normal file
|
After Width: | Height: | Size: 778 B |
BIN
public/props/pillar.png
Normal file
|
After Width: | Height: | Size: 486 B |
BIN
public/props/plant.png
Normal file
|
After Width: | Height: | Size: 396 B |
BIN
public/props/planter.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/props/plywoodBar.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/props/pokie.png
Normal file
|
After Width: | Height: | Size: 903 B |
BIN
public/props/poolTable.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |