White the Joke Shop canopy signature band to match the reference
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-03 20:07:01 +01:00
1 parent 6824dd76a1
commit a51dae2c33
6 files changed
+18 -7

No files matched your search

+5
View File
@@ -194,6 +194,11 @@ licence-free zone only.
field, six columns, eight steps, landing + guard spawn at y=1.0) while keeping the arrival field, six columns, eight steps, landing + guard spawn at y=1.0) while keeping the arrival
staging (`bulb_canopy`, `sedan`, `handrail`, barriers); Godot 276/276, screenshot smoke staging (`bulb_canopy`, `sedan`, `handrail`, barriers); Godot 276/276, screenshot smoke
21/0, `13-studio-arrival.png` recaptured. 21/0, `13-studio-arrival.png` recaptured.
**Fix 3 landed:** the Joke Shop canopy signature band is now white (`Color(0.90, 0.88, 0.80)`)
over the black fascia, matching the concept's "white celebrity signatures"; a test asserts
the `CanopySignatures` label is white, Godot 276/276, `12-joke-shop.png` + the three-up
board recaptured. Note: fix 2 (blade sign) is already a circular disc on a roof pole in the
code (`37f925c`); the ranking note was stale.
- [ ] Lighting: `lighting`/`lookdev` pass on sconces, canopy, marquee and street lamps with - [ ] Lighting: `lighting`/`lookdev` pass on sconces, canopy, marquee and street lamps with
day/late captures; verify local attenuation stays at 1.0 and no constant-falloff light returns. day/late captures; verify local attenuation stays at 1.0 and no constant-falloff light returns.
- [ ] Set dressing: review entrance and sidewalk prop clusters (`set-dressing`) for occlusion, - [ ] Set dressing: review entrance and sidewalk prop clusters (`set-dressing`) for occlusion,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 115 KiB

+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"board": "jokeshop-day-board.jpg", "board": "jokeshop-day-board.jpg",
"caption": "Joke Shop frontage, day. Photo: local-only research frame (tmp/research/comedy-store). Concept: photo-anchored (gemini + gpt). Capture: dark stucco wall tile.", "caption": "Joke Shop frontage, day. Photo: local-only research frame (tmp/research/comedy-store). Concept: photo-anchored (gemini + gpt). Capture: dark stucco wall tile + white signature band.",
"photo": "tmp/research/comedy-store/01.jpg (local-only, gitignored)", "photo": "tmp/research/comedy-store/01.jpg",
"concept": "docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.png", "concept": "docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.png",
"capture": "docs/screenshots/12-joke-shop.png" "capture": "docs/screenshots/12-joke-shop.png"
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 552 KiB

After

Width:  |  Height:  |  Size: 553 KiB

+6 -4
View File
@@ -378,7 +378,9 @@ func _build_comedy_store_building() -> void:
var front := cz + d * 0.5 var front := cz + d * 0.5
var black := Color(0.105, 0.10, 0.105) var black := Color(0.105, 0.10, 0.105)
var black_deep := Color(0.045, 0.045, 0.05) var black_deep := Color(0.045, 0.045, 0.05)
var signature := Color(0.58, 0.56, 0.52) # The canopy carries the real club's white celebrity signatures over the black
# fascia; keep them near-white so they read as chalk/paint from the sidewalk.
var signature := Color(0.90, 0.88, 0.80)
var red := Color(0.42, 0.035, 0.045) var red := Color(0.42, 0.035, 0.045)
# Main hall. The black stucco is the real building's dominant surface: a flat # Main hall. The black stucco is the real building's dominant surface: a flat
# matte charcoal tile now replaces the grey paver texture so the wall reads as # matte charcoal tile now replaces the grey paver texture so the wall reads as
@@ -408,9 +410,9 @@ func _build_comedy_store_building() -> void:
_add_box(building, Vector3(0.20, 0.92, 4.9), _add_box(building, Vector3(0.20, 0.92, 4.9),
Vector3(side * (w * 0.5 - 0.22), 4.98, front + 2.35), Vector3(side * (w * 0.5 - 0.22), 4.98, front + 2.35),
black_deep, true, null, Vector2.ONE, "concrete") black_deep, true, null, Vector2.ONE, "concrete")
# Signature scribbles on the fascia and the wall. Keeping them as a few # White signature scribbles on the fascia. Keeping them as a few texture-free
# texture-free labels reads as handwriting at gameplay distance and costs # labels reads as handwriting at gameplay distance and costs no extra draw
# no extra draw calls compared with stamping dozens of decals. # calls compared with stamping dozens of decals.
var scribbles := "Richard Pryor Robin Williams George Carlin\n" \ var scribbles := "Richard Pryor Robin Williams George Carlin\n" \
+ "Dave Chappelle Bill Burr Ali Wong Marc Maron\n" \ + "Dave Chappelle Bill Burr Ali Wong Marc Maron\n" \
+ "Joan Rivers Sam Kinison Andrew Dice Clay Mitzi Shore" + "Joan Rivers Sam Kinison Andrew Dice Clay Mitzi Shore"
+5 -1
View File
@@ -62,6 +62,10 @@ func test_joke_shop_uses_the_real_sunset_strip_layout() -> bool:
builder.build() builder.build()
var a := TestUtils.check(root.find_child("SignatureCanopy", true, false) != null, var a := TestUtils.check(root.find_child("SignatureCanopy", true, false) != null,
"the signature-covered canopy is built") "the signature-covered canopy is built")
var sig_label := root.find_child("CanopySignatures_west", true, false) as Label3D
var a2 := TestUtils.check(sig_label != null
and sig_label.modulate.r > 0.85 and sig_label.modulate.g > 0.85,
"the canopy signature band is white, matching the reference's white celebrity names")
var sign := root.find_child("ComedySignLabel", true, false) as Label3D var sign := root.find_child("ComedySignLabel", true, false) as Label3D
var b := TestUtils.check(sign != null and sign.text.contains("JOKE") var b := TestUtils.check(sign != null and sign.text.contains("JOKE")
and sign.text.contains("SHOP"), "the circular blade sign carries the club wordmark") and sign.text.contains("SHOP"), "the circular blade sign carries the club wordmark")
@@ -90,7 +94,7 @@ func test_joke_shop_uses_the_real_sunset_strip_layout() -> bool:
and WorldBuilder.placement_problems(placements).is_empty(), and WorldBuilder.placement_problems(placements).is_empty(),
"the Joke Shop prop placements stay on the sidewalk and clear the lane") "the Joke Shop prop placements stay on the sidewalk and clear the lane")
root.free() root.free()
return a and b and c and d and e and f and g and g2 and h return a and a2 and b and c and d and e and f and g and g2 and h
func test_joke_shop_geometry_stays_inside_the_map_budget() -> bool: func test_joke_shop_geometry_stays_inside_the_map_budget() -> bool:
var root := Node3D.new() var root := Node3D.new()