Give the Joke Shop a real queue line and thicken the rope barrier
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-06 20:47:28 +01:00
1 parent 6381dbc5cb
commit efa062833f
21 files changed
+51 -14

No files matched your search

+2
View File
@@ -9,6 +9,8 @@ Semantic Versioning.
### Fixed ### Fixed
- The red event banners are lit from the top down at night instead of reading as flat red cards. - The red event banners are lit from the top down at night instead of reading as flat red cards.
- The Joke Shop has a readable queue: a velvet rope line leading to the check-in podium, a thicker
bike-rack barricade on the curb side, and a planter no longer clipping the palm foliage.
- Street lamps now throw a warm pool on the pavement instead of dimly washing the whole walkway. - Street lamps now throw a warm pool on the pavement instead of dimly washing the whole walkway.
- The flashlight actually lights what it points at. It was tuned to a beam so weak it changed the - The flashlight actually lights what it points at. It was tuned to a beam so weak it changed the
frame by less than one 255th of a level; it now throws a visible pool on the door and the pavement frame by less than one 255th of a level; it now throws a visible pool on the door and the pavement
+12 -3
View File
@@ -971,9 +971,18 @@ scorecard source, this milestone is the actionable list.
takes the pool 14.1 → 16.0 and the gap between poles 2.7 → 1.3, pool/gap 5.2 → 12.3. takes the pool 14.1 → 16.0 and the gap between poles 2.7 → 1.3, pool/gap 5.2 → 12.3.
- [x] Refresh `docs/screenshots/` for the whole roster and the new flashlight; `check_screenshots.sh` - [x] Refresh `docs/screenshots/` for the whole roster and the new flashlight; `check_screenshots.sh`
reports 21 good / 0 bad. reports 21 good / 0 bad.
- [ ] Set dressing: fix the Joke Shop queue story (podium/stanchion line at the door), rope - [x] **Joke Shop queue story.** The four queue props were scattered (stanchions at ±3, a barricade
barrier thickness, the west palm overlap and the empty sidewalk light pool; apply the same at x 2.2, the podium at 6.8) so nothing read as a queue. They are now one line: four
review to Hollywood and the TV Studio. stanchions 0.9 m apart west of the guest approach lane, the check-in podium at its head, and
the bike-rack barricade on the curb side. The placements stay outside the `guest approach
lane` exclusion that `placement_problems()` enforces.
- [x] **Rope and barrier thickness.** Bike-rack frame 22 → 28 mm, bars 10 → 12 mm, velvet rope
18 → 22 mm; the old sizes read as wire at 8 m.
- [x] **West palm / planter overlap.** The planter box sat under the west palm canopy (palm spans
x −15.0…−11.0 there) and the foliage cards clipped its lip; it moved 1.6 m clear.
- [ ] The same queue/set-dressing review for Hollywood and the TV Studio.
- [ ] Sidewalk light pool at the Joke Shop: the entrance walkway measures 20.7/255 against 3.0 on
the side pavement, so a pool exists but only at the door; the queue area itself is unlit.
- [ ] Build one real-photo comparison for street furniture and record the accepted mismatches. - [ ] Build one real-photo comparison for street furniture and record the accepted mismatches.
### Evidence and release ### Evidence and release
+3 -3
View File
@@ -144,12 +144,12 @@
"crowd_barrier": { "crowd_barrier": {
"bounds_godot": { "bounds_godot": {
"max": [ "max": [
1.116, 1.12,
1.066, 1.07,
0.307 0.307
], ],
"min": [ "min": [
-1.122, -1.128,
-0.014, -0.014,
-0.307 -0.307
] ]
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

+15
View File
@@ -350,6 +350,21 @@ material through `night_energy` metadata so `set_night_mode` keeps the ratio ins
No clipping in either state, and the Compatibility renderer draws it with the same flat emissive No clipping in either state, and the Compatibility renderer draws it with the same flat emissive
material as before — the change is geometry plus per-material energy, not a new shader. material as before — the change is geometry plus per-material energy, not a new shader.
## Set dressing — Joke Shop queue (2026-11-06)
The queue props were placed individually (`stanchion` at ±3, `crowd_barrier` at x 2.2, podium at 6.8),
so no line read and the stanchions' 0.9 m velvet stubs pointed in unrelated directions. They are now
one queue: four stanchions 0.9 m apart west of the guest approach lane, the check-in podium at the
head, and the barricade on the curb side. The line has to sit outside
`PROP_EXCLUSIONS["guest approach lane"]` (x ±1.4), which is what the placement validator enforces —
the first attempt put the podium at x 0.4 and the test caught it.
Readability at 8 m drove the thickness pass: bike-rack frame 22 → 28 mm, bars 10 → 12 mm, velvet rope
18 → 22 mm. The west planter also moved 1.6 m clear of the palm canopy, which was clipping its lip.
Measured at night afterwards: the entrance walkway sits at 20.7/255 against 3.0 on the side pavement,
so the door pool exists; the queue area itself is still unlit and stays queued as a follow-up.
## Scorecard skeleton ## Scorecard skeleton
Verdicts use `qa-review` semantics: **P0** (blocker: wrong scale, broken normals, budget fail), Verdicts use `qa-review` semantics: **P0** (blocker: wrong scale, broken normals, budget fail),
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 KiB

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 455 KiB

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 757 KiB

After

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 KiB

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 615 KiB

After

Width:  |  Height:  |  Size: 615 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 969 KiB

After

Width:  |  Height:  |  Size: 969 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 KiB

After

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

+13 -5
View File
@@ -161,15 +161,23 @@ const VENUE_SPECS := {
"sunset_across_street": true, "hollywood_lane_markings": true, "sunset_across_street": true, "hollywood_lane_markings": true,
}, },
"prop_placements": [ "prop_placements": [
{"zone": "entrance", "prop": "security_podium", "x": 6.8, "z": 5.8, "rot": -15.0}, # Queue story: a rope line guides the walk-up from the sidewalk to the door,
{"zone": "entrance", "prop": "crowd_barrier", "x": 2.2, "z": 9.0}, # with the check-in podium at its head and a barricade holding the street
{"zone": "entrance", "prop": "stanchion", "x": -3.0, "z": 9.4}, # side. The posts are 0.9 m apart so the 0.9 m velvet stubs on each post join
{"zone": "entrance", "prop": "stanchion", "x": 3.0, "z": 9.4}, # into one continuous rope instead of three disconnected ones.
{"zone": "entrance", "prop": "stanchion", "x": -4.5, "z": 8.6},
{"zone": "entrance", "prop": "stanchion", "x": -3.6, "z": 8.6},
{"zone": "entrance", "prop": "stanchion", "x": -2.7, "z": 8.6},
{"zone": "entrance", "prop": "stanchion", "x": -1.8, "z": 8.6},
{"zone": "entrance", "prop": "security_podium", "x": -1.7, "z": 7.5, "rot": -95.0},
{"zone": "entrance", "prop": "crowd_barrier", "x": -3.2, "z": 10.6},
{"zone": "mid_block", "prop": "palm_tree", "x": -13.0, "z": 8.0, "rot": 8.0}, {"zone": "mid_block", "prop": "palm_tree", "x": -13.0, "z": 8.0, "rot": 8.0},
{"zone": "mid_block", "prop": "palm_tree", "x": 13.0, "z": 8.0, "rot": -8.0}, {"zone": "mid_block", "prop": "palm_tree", "x": 13.0, "z": 8.0, "rot": -8.0},
{"zone": "mid_block", "prop": "trash_bin", "x": -11.5, "z": 7.2, "accessory": "bag"}, {"zone": "mid_block", "prop": "trash_bin", "x": -11.5, "z": 7.2, "accessory": "bag"},
{"zone": "mid_block", "prop": "trash_bin", "x": 10.5, "z": 7.2}, {"zone": "mid_block", "prop": "trash_bin", "x": 10.5, "z": 7.2},
{"zone": "mid_block", "prop": "planter_box", "x": -12.0, "z": 9.7}, # Clear of the west palm canopy (which spans x -15.0 .. -11.0 there); the box
# used to sit under it and the foliage cards clipped the planter lip.
{"zone": "mid_block", "prop": "planter_box", "x": -10.4, "z": 9.7},
{"zone": "mid_block", "prop": "round_planter", "x": 8.5, "z": 7.3}, {"zone": "mid_block", "prop": "round_planter", "x": 8.5, "z": 7.3},
{"zone": "curb", "prop": "a_frame_sign", "x": 5.0, "z": 7.8, "rot": 18.0}, {"zone": "curb", "prop": "a_frame_sign", "x": 5.0, "z": 7.8, "rot": 18.0},
{"zone": "curb", "prop": "newspaper_box", "x": 11.0, "z": 10.6, "rot": -12.0}, {"zone": "curb", "prop": "newspaper_box", "x": 11.0, "z": 10.6, "rot": -12.0},
+6 -3
View File
@@ -2890,11 +2890,13 @@ def build_prop(name):
p.append(lathe("Stripe", [(0.118, 0.22), (0.096, 0.34)], M("reflective"), seg=16)) p.append(lathe("Stripe", [(0.118, 0.22), (0.096, 0.34)], M("reflective"), seg=16))
p.append(lathe("Stripe2", [(0.08, 0.42), (0.064, 0.50)], M("reflective"), seg=16)) p.append(lathe("Stripe2", [(0.08, 0.42), (0.064, 0.50)], M("reflective"), seg=16))
elif name == "crowd_barrier": # steel bike-rack barricade, 2.2 m elif name == "crowd_barrier": # steel bike-rack barricade, 2.2 m
# 28 mm frame and 12 mm bars: the old 22/10 mm read as wire at 8 m, and a real
# bike-rack barricade is chunkier than that.
p.append(tube("Frame", [(-1.1, 0, 0.12), (-1.1, 0, 1.05), (1.1, 0, 1.05), (1.1, 0, 0.12), p.append(tube("Frame", [(-1.1, 0, 0.12), (-1.1, 0, 1.05), (1.1, 0, 1.05), (1.1, 0, 0.12),
(-1.1, 0, 0.12)], 0.022, M("steel"), seg=8, caps=False)) (-1.1, 0, 0.12)], 0.028, M("steel"), seg=8, caps=False))
for i in range(13): for i in range(13):
x = -0.96 + i * 0.16 x = -0.96 + i * 0.16
p.append(cyl("Bar", 0.01, 0.01, 0.90, (x, 0, 0.585), M("steel"), seg=6)) p.append(cyl("Bar", 0.012, 0.012, 0.90, (x, 0, 0.585), M("steel"), seg=6))
for x in (-1.0, 1.0): for x in (-1.0, 1.0):
p.append(tube("Foot", [(x, -0.30, 0.0), (x, 0.0, 0.14), (x, 0.30, 0.0)], 0.018, p.append(tube("Foot", [(x, -0.30, 0.0), (x, 0.0, 0.14), (x, 0.30, 0.0)], 0.018,
M("steel"), seg=6)) M("steel"), seg=6))
@@ -2903,8 +2905,9 @@ def build_prop(name):
M("chrome"), seg=20)) M("chrome"), seg=20))
p.append(cyl("Post", 0.025, 0.025, 0.90, (0, 0, 0.50), M("chrome"), seg=12)) p.append(cyl("Post", 0.025, 0.025, 0.90, (0, 0, 0.50), M("chrome"), seg=12))
p.append(sphere("Top", 0.04, (0, 0, 0.97), M("chrome"), seg=12, rings=8)) p.append(sphere("Top", 0.04, (0, 0, 0.97), M("chrome"), seg=12, rings=8))
# 22 mm velvet rope: a 36 mm one read as thread at gameplay distance.
p.append(tube("Rope", [(0, 0.0, 0.92), (0.2, 0.0, 0.80), (0.45, 0.0, 0.74), p.append(tube("Rope", [(0, 0.0, 0.92), (0.2, 0.0, 0.80), (0.45, 0.0, 0.74),
(0.70, 0.0, 0.80), (0.9, 0.0, 0.92)], 0.018, (0.70, 0.0, 0.80), (0.9, 0.0, 0.92)], 0.022,
M("velvet_red"), seg=8)) M("velvet_red"), seg=8))
p.append(cyl("Hook", 0.022, 0.022, 0.05, (0.9, 0, 0.92), M("brass"), seg=8, p.append(cyl("Hook", 0.022, 0.022, 0.05, (0.9, 0, 0.92), M("brass"), seg=8,
rot=(0, math.radians(90), 0))) rot=(0, math.radians(90), 0)))