feat: hero asset batch 2 — yatai, koban, phone booths, bus stops, bikes

Second round of original Blender-kitbashed street furniture
(tools/build_hero_assets.py):

- yatai.glb: ramen cart — noren curtain strips on a hanger bar, counter,
  wheels, three stools, paper lantern, red roof with ink trim; one at
  every market mouth (wood collider)
- koban.glb: police box with teal roof, door, framed window, sign board
  and red lamp — watches the central crossing from the SE plaza corner
- phonebooth.glb: green-framed glass booth on ~25% of retail corners
- busstop.glb: bench + glass canopy + yellow sign disc, alternating
  blocks along the central avenue, both directions
- bicycle.glb: torus-wheeled bikes with frame/seat/basket, parked in
  seeded rows of 2-4 beside building fronts

All toonified with ink outlines; colliders acoustics-tagged (wood/
concrete/glass/metal). Movement 11/11, smoke 0, acoustics ALL PASSED.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Nicholas Butzke
2026-07-19 03:04:54 -04:00
co-authored by Claude Fable 5
parent 7f9a579b63
commit 18f50adb78
7 changed files with 110 additions and 2 deletions
+24 -2
View File
@@ -468,6 +468,17 @@ func _standard_block(c: Vector3, bx: int, bz: int) -> void:
var y := float(f) * FLOOR_H - 0.4
_box_static(c + Vector3(-2.0 + float(f) * 1.3, y, 4.0), Vector3(2.2, 0.16, 2.2), METAL,
"Esc_%d_%d_%d" % [bx, bz, f], "metal")
# Sidewalk life: phone booth on some corners, bike rows by the fronts
if _rng.randi() % 4 == 0:
_hero("phonebooth", c + Vector3(-half - 0.6, 0.1, -half - 0.6), _rng.randf_range(0.0, 360.0),
Vector3(1.2, 2.7, 1.2), 1.35, "glass")
if _rng.randi() % 2 == 0:
var bikes := 2 + _rng.randi() % 3
var bside := 1.0 if _rng.randi() % 2 == 0 else -1.0
for b in bikes:
_kit_prop_path("res://assets/props/hero/bicycle.glb",
c + Vector3(bside * (half + 1.0), 0.1, -6.0 + float(b) * 1.5),
90.0 * bside + _rng.randf_range(-14.0, 14.0), 1.0)
if _rng.randi() % 3 == 0:
_spawn_points.append(c + Vector3(0, 1.5, 0))
@@ -577,9 +588,10 @@ func _market_block(c: Vector3, bx: int, bz: int) -> void:
# Lantern string over each row
for l in 6:
_deco_box(Vector3(x, 3.6, c.z - 17.5 + float(l) * 7.0), Vector3(0.32, 0.45, 0.32), Color(1.0, 0.62, 0.25), true)
# Hand carts at the market mouths
# Hand cart + kitbashed yatai ramen stand at the market mouths
_kit_prop_path("res://assets/props/town/cart.glb", c + Vector3(0, 0.02, 19.0), _rng.randf_range(-30, 30), 3.0)
_kit_prop_path("res://assets/props/town/cart-high.glb", c + Vector3(2.0, 0.02, -19.0), _rng.randf_range(150, 210), 3.0)
_hero("yatai", c + Vector3(2.0, 0.02, -19.0), _rng.randf_range(150.0, 210.0),
Vector3(3.0, 2.8, 1.8), 1.4, "wood")
# Vending pair at the north entry
for v in 2:
_box_static(c + Vector3(-1.5 + 3.0 * float(v), 1.0, -BLOCK * 0.5 + 3.0), Vector3(1.1, 2.0, 0.9),
@@ -599,6 +611,10 @@ func _plaza_block(c: Vector3, bx: int, bz: int) -> void:
# Kitbashed clock tower on the south-west plaza cell
if bx == 4 and bz == 5:
_hero("clock", c + Vector3(0, 0.1, 0), 0.0, Vector3(3.2, 10.5, 3.2), 5.25, "concrete")
# Koban police box watching the central crossing
if bx == 5 and bz == 5:
_hero("koban", c + Vector3(-BLOCK * 0.5 + 4.0, 0.02, -BLOCK * 0.5 + 4.0), 225.0,
Vector3(3.7, 3.4, 3.5), 1.7, "concrete")
# The Crossing screen tower on the single centre-most plaza cell
if bx == 5 and bz == 4:
_box_static(c + Vector3(0, 9.0, 0), Vector3(6.0, 18.0, 6.0), METAL.darkened(0.2), n + "_ScreenTower", "metal")
@@ -766,6 +782,12 @@ func _build_avenues() -> void:
# Traffic signal on the opposite diagonal corner of each crossing
_kit_prop_path("res://assets/props/roads/light-square-cross.glb",
Vector3(x, 0, z - side * (ROAD_W * 0.5 + 0.8)), 90.0 if side > 0 else -90.0, lamp_scale * 0.8)
# Bus stop shelters on alternating blocks along the avenue
if int(roundf(z / PITCH)) % 2 == 0:
_hero("busstop", Vector3(ROAD_W * 0.5 + 2.0, 0.02, z + 18.0), -90.0,
Vector3(3.8, 2.6, 1.6), 1.3, "metal")
_hero("busstop", Vector3(-ROAD_W * 0.5 - 2.0, 0.02, z - 18.0), 90.0,
Vector3(3.8, 2.6, 1.6), 1.3, "metal")
for x in lines:
if absf(x) < 1.0:
continue