4ee4cf343b
4 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
4ee4cf343b |
The door stops being 28 rectangles
The rope is where the player spends most of the night and it was still coloured primitives behind a single street plate. - kebabShop: the moral centre of the game (design §5) was three rects and the word KEBABS. The warm spill on the footpath stays procedural — it is the only warm light in the scene and it is what says the shop is open. - front:<venueId>: one facade per rung of the ladder, so a promotion is visible from the footpath. ROOM also loses the procedural NOT TONIGHT sign, because "no sign. no socials." is its actual entry in data/venues.ts. - Footpath: a street lamp, a bin, a waiting cab, and brass stanchions on the carpet. The cab is alpha'd back and depth-1 so it never looks clickable next to the kebab shop, which is. - poster4..poster9, so four venues stop sharing one wall of three. Mangled lettering is correct on posters and always has been. And a composition bug I put in this same wave: the per-venue street plates were first prompted as "frontage", so The Royal's backdrop was a whole pub with its own central door and the venue facade then sat on top of it — two pub fronts, two doors. Voltage's original plate has always been a WALL, which is what a backdrop has to be. Re-prompted all three as blank walls and regenerated. No test would have caught that; I found it by looking at the screen. 127 sprites now, none missing. Gate: lint clean, build clean, 821 tests passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
74cbd71ad3 |
Materials, and the floor-cache bug that would have eaten the promotion
Two things, one of them a real bug. THE BUG: bakeTiles baked to a single global 'floor:tiles' and early-returned if that key existed. Textures outlive a scene, so the first venue you played baked the floor for every venue after it — you would survive a week at The Royal, get promoted, walk into Voltage and still be standing on the pub's carpet. It only shows on promotion, which is exactly the moment the venue ladder is supposed to pay off, and never in a dev route because those reload the page. The baked texture is now keyed per venue; verified by switching venues inside one session and watching the concrete arrive. MATERIALS: FloorLayout.materials names a generated plate per tile kind and the baker stamps it TINTED to the palette colour. The plate carries grain, the palette keeps hue — an untinted photo-real plate blows straight past the brightness band the whole room was tuned in, and darkness is the mechanic. Plates are 16x16, the game's own tile, because at that size "carpet" is structured noise, which is also what pub carpet looks like from head height. Ten of them: carpet, concrete, deck, parquet, looTile, paving, plaster, brick, timber, steel. No plate named, or art not landed, falls back to flat colour exactly as before. Wave 2 filler for the two spaces the review found genuinely empty — The Royal's central carpet (four props across ~500 tiles) and ROOM's east hall (~23% of its interior with no lights and three props) — plus the kit every real room has and no game room does: fire extinguishers, exit signs, CCTV, bins, a notice board, ceiling fans. Voltage gets the same pass; being the reference room is how it quietly missed the last one. The invariant caught a duplicate prop id I introduced while placing these, which is what it is for. Also relaxed one ROOM assertion that keyed on array order: it checked that the FIRST sodium light stands over the loading dock, which broke the moment the east hall legitimately burned the same colour. It now checks that one of them does. Gate: lint clean, tsc clean, 821 tests passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
22bd43857c |
Review pass: the room-specific bugs a shared FloorView was hiding
Three independent reviewers checked each new venue against its brief. No blockers, all three rooms genuinely distinct — but two of the findings were mine, in the file the layout authors were told not to touch. FloorView was still drawing two things at Voltage's coordinates: - The scan beams pivoted on a hardcoded (38,23) — Voltage's mirror ball. In The Royal that swept two beams across the empty middle of the pub, twenty-five tiles from that venue's dance floor. Now derived from the layout's own discoball, and a venue without one gets no beams, because the beams ARE the ball's light. - The resident DJ stood at a hardcoded (55.5, 22.5) — Voltage's booth, which in The Royal is the middle of the bistro. Now placed from the venue's own gear and stepped clear of `posts.decks`, so a player on a DJ shift is never standing inside him. The beat-bob had the same constant baked into it. Elevate's staffDj prop is dropped as a consequence: with a resident DJ derived per venue it would have made two DJs on the plinth, and three once the player took the shift. New invariant: a staff prop may not stand on a post tile. Elevate's bartender was on the exact tile the bar shift teleports the player to, so the shift would have been played from inside her. Caught by the rule, then fixed. `mirror` and `graffiti` kinds added. Elevate was standing BOTH its mirrors up as `poster3` (the author raised it as a contract request and stubbed it honestly), which would have hung the same torn gig poster in a marble bathroom and called it a mirror. ROOM's toilets get the graffiti its brief always asked for. The Royal: TAB screens moved onto the wall they belong on rather than floating mid-carpet, the trough given its own fluoro (the one fixture that room is known for was rendering unlit), the beer garden's dark middle band lit — 288 tiles on two lights left the gate everyone walks through in the dark — the out-of-order sign moved off the tile the queue stands on, and two comments corrected to describe what the code actually does. Also hardened the farm client: `_req` raised SystemExit, which is a BaseException, so `except Exception` in the batch's worker threads did not catch it and one stray 401 during a poll killed a 43-asset run after a single asset. It now raises a normal error and retries transient 401/429/5xx with backoff. Gate: lint clean, tsc clean, floor suite 271 passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
4caa901df2 |
Four venues, four rooms: the ladder stops being one map with different numbers
The venue ladder has always listed four venues in data/venues.ts, but they shared ONE floor map and differed only by difficulty knobs — so a promotion you survived a whole week for looked exactly like the room you had just left. - venueMap.ts grows a FloorLayout contract (map + props + lights + posts + probes + palette) and the newGrid() primitives every room is painted with. Voltage stays IN venueMap rather than moving to layouts/, so the new rooms can import primitives from it without closing an import cycle. - Three new rooms in src/scenes/floor/layouts/: The Royal (horseshoe public bar, pool room, pokies corner, trough + two cubicles, a beer garden that is plainly the nicest room in the pub, and a DJ "corner" that is a folding table because this pub never built a booth), Elevate (open-air rooftop — most of the grid is sky, the DJ is on an unwalled plinth, you arrive by lift), ROOM (concrete warehouse, pillars you path around, central booth, loading-dock smoking area, twelve lights in the whole venue). - Nothing about a room is a module singleton any more. FloorView, sweep and FloorDemoScene take the layout; the door picks its street plate by venue id. - FloorDemoScene's six hardcoded station spots (TAPS_SPOT, DECKS_SPOT, ...) were Voltage's tile coordinates. At four venues a hardcoded (47,3) puts the bar shift inside The Royal's pool room, so each layout now names its own stations and the scene reads them from there. - tests/floor/layoutInvariants.ts is an executable rulebook: perimeter holds, every walkable tile reachable from the entry, anchors on walkable ground, posts not sealed (a post on a sealed tile freezes the player for the night — that has shipped twice), probes reachable, props on-grid. Proved against Voltage BEFORE the new rooms were authored against it. Dev route #floor:<venueId> boots the floor straight into one room, because otherwise seeing ROOM means surviving three weeks of the ladder. Gate: lint clean, build clean, 821 tests passing (was 784). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |