Give the Joke Shop a dark stucco wall and a photo-anchored concept
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-03 16:22:20 +01:00
1 parent 36583921cf
commit 634b1f75a3
14 files changed
+56 -13

No files matched your search

+7
View File
@@ -36,6 +36,10 @@ const T_LIMESTONE_NORMAL := preload(PICK_DIR + "stone_steps_normal.png")
## `stone_steps` tile reads as small pavers, not wall ashlar).
const T_ASHLAR := preload(PICK_DIR + "limestone_ashlar.png")
const T_ASHLAR_NORMAL := preload(PICK_DIR + "limestone_ashlar_normal.png")
## Dark stucco for the Comedy Store hall wall: flat matte charcoal (the concrete
## paver tile read as grey masonry, not the building's flat black surface).
const T_STUCCO := preload(PICK_DIR + "dark_stucco.png")
const T_STUCCO_NORMAL := preload(PICK_DIR + "dark_stucco_normal.png")
## Roughness / metallic pairs per surface role. Exposed so tests and tooling can
## assert the profiles instead of hard-coding numbers twice.
@@ -118,6 +122,9 @@ static func limestone(tint: Color = Color(1, 1, 1), uv_scale: Vector2 = Vector2(
static func ashlar(tint: Color = Color(1, 1, 1), uv_scale: Vector2 = Vector2(6, 3)) -> StandardMaterial3D:
return textured(T_ASHLAR, tint, uv_scale, "stone", T_ASHLAR_NORMAL)
static func stucco(tint: Color = Color(1, 1, 1), uv_scale: Vector2 = Vector2(6, 3)) -> StandardMaterial3D:
return textured(T_STUCCO, tint, uv_scale, "concrete", T_STUCCO_NORMAL)
static func asphalt(tint: Color = Color(1, 1, 1), uv_scale: Vector2 = Vector2(30, 7),
wet: bool = false) -> StandardMaterial3D:
var texture: Texture2D = T_ASPHALT_WET if wet else T_ASPHALT
+6 -3
View File
@@ -10,6 +10,7 @@ const T_ASPHALT := preload(PICK_DIR + "asphalt.png")
const T_AWNING := preload(PICK_DIR + "awning_canvas.png")
const T_LIMESTONE := preload(PICK_DIR + "stone_steps.png")
const T_ASHLAR := preload(PICK_DIR + "limestone_ashlar.png")
const T_STUCCO := preload(PICK_DIR + "dark_stucco.png")
## One skyline panorama per shift phase (realism pass): hazy daylight, warm dusk
## with lit windows, and a night city. The old single strip was a black silhouette.
const T_SKYLINE_DAY := preload(PICK_DIR + "skyline_day.png")
@@ -374,10 +375,12 @@ func _build_comedy_store_building() -> void:
var black_deep := Color(0.045, 0.045, 0.05)
var signature := Color(0.58, 0.56, 0.52)
var red := Color(0.42, 0.035, 0.045)
# Main hall. The black stucco is the real building's dominant surface; the
# concrete texture keeps it matte instead of turning it into glossy paint.
# 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
# dark plaster, not masonry. The 0.105 tint keeps the effective value near the
# reference's flat black while the fine grain stops it looking like glossy paint.
_add_box(building, Vector3(w, h, d), Vector3(0, h * 0.5, cz), black,
false, T_CONCRETE, Vector2(w * 0.42, h * 0.42), "concrete")
false, T_STUCCO, Vector2(w * 0.42, h * 0.42), "concrete")
# Low plinth and a thin parapet cap so the roofline reads against the hill.
_add_box(building, Vector3(w, 0.30, 0.34), Vector3(0, 0.15, front + 0.05),
Color(0.07, 0.07, 0.075), true, null, Vector2.ONE, "stone")
+10 -1
View File
@@ -76,12 +76,21 @@ func test_joke_shop_uses_the_real_sunset_strip_layout() -> bool:
"the low entrance step is built")
var g := TestUtils.check(root.find_child("AlleyWall", true, false) == null,
"the old alley walls are gone")
# The hall wall uses the dark stucco pick, not the grey sidewalk-paver tile,
# so it reads as the real club's flat black plaster.
var wall := root.find_child("Building", true, false) as Node3D
var wall_mesh := wall.get_child(0) as MeshInstance3D if wall != null and wall.get_child_count() > 0 else null
var wall_mat: Material = wall_mesh.mesh.surface_get_material(0) if wall_mesh != null and wall_mesh.mesh != null else null
var g2 := TestUtils.check(wall_mat is StandardMaterial3D
and (wall_mat as StandardMaterial3D).albedo_texture != null
and (wall_mat as StandardMaterial3D).albedo_texture.resource_path.contains("dark_stucco"),
"the hall wall carries the dark stucco texture")
var placements: Array = builder.spec.get("prop_placements", [])
var h := TestUtils.check(not placements.is_empty()
and WorldBuilder.placement_problems(placements).is_empty(),
"the Joke Shop prop placements stay on the sidewalk and clear the lane")
root.free()
return a and b and c and d and e and f and g and h
return a 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:
var root := Node3D.new()