feat: hero batch 3 — pedestrian footbridge + viaduct station platforms

- footbridge.glb: 18m truss footbridge over the central avenue one block
  south of the rail line — X-pattern teal trusses, mesh railings, real
  stair flights at both ends. Deck and stairs are WALKABLE (box deck
  collider + invisible ramp colliders over the stair visuals): a third
  elevated crossing route between the viaduct and the plaza, and a new
  grapple anchor over the avenue
- platform.glb: station platform strips on the viaduct deck flanking the
  crossing — canopy on posts, benches, line signs; dresses the deck route
  players actually run
- Fixed a parse error from an undefined color constant caught by the
  capture loop (blank render -> error -> fix -> verified)

Movement 11/11, smoke 0 failures; full-city aerial verified.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Nicholas Butzke
2026-07-19 03:10:05 -04:00
co-authored by Claude Fable 5
parent 18f50adb78
commit 911066875b
4 changed files with 83 additions and 1 deletions
+56
View File
@@ -301,3 +301,59 @@ phonebooth()
busstop()
bicycle()
print("hero: batch 2 built")
# ── Batch 3: footbridge + station platform ───────────────────────────────────
def footbridge():
"""Pedestrian bridge: 18m deck, X-trusses, railings, stairs both ends."""
clear()
SPAN, DH = 18.0, 5.5
box("deck", (SPAN, 3.0, 0.35), (0, 0, DH), GRAY, 0.03)
box("deck_edge", (SPAN + 0.2, 3.2, 0.12), (0, 0, DH - 0.22), INK, 0.01)
# side trusses: X pattern of rotated bars + top chord
for sy in (-1, 1):
y = sy * 1.45
box("chord", (SPAN, 0.12, 0.12), (0, y, DH + 1.25), TEAL, 0.01)
n = 6
for i in range(n):
x = -SPAN / 2 + SPAN / n * (i + 0.5)
for ang in (0.6, -0.6):
box("truss", (0.09, 0.09, 1.55), (x, y, DH + 0.62), TEAL, 0.0,
rot=(0, ang, 0))
# rail mesh
box("rail", (SPAN, 0.05, 0.5), (0, y, DH + 0.55), mat("railmesh", (0.3, 0.32, 0.38)), 0.0)
# stairs at both ends, descending outward along the bridge axis
steps = 10
for end in (-1, 1):
for i in range(steps):
z = DH - 0.3 - i * (DH - 0.3) / steps
x = end * (SPAN / 2 + 0.5 + i * 0.62)
box("step", (0.62, 2.6, 0.22), (x, 0, z), GRAY, 0.01)
# stair rails
box("stairrail", (steps * 0.64, 0.08, 0.08),
(end * (SPAN / 2 + 0.4 + steps * 0.31), 1.25, DH * 0.55), INK, 0.0,
rot=(0, end * -0.68, 0))
export(os.path.join(OUT, "footbridge.glb"))
def platform():
"""Station platform strip for the viaduct deck: canopy, benches, signs."""
clear()
L = 14.0
for i in range(4):
x = -L / 2 + L / 4 * (i + 0.5)
cyl("post", 0.1, 2.6, (x, 0, 1.3), METAL)
box("proof", (L, 2.2, 0.12), (0, 0, 2.7), WHITE, 0.02)
box("proof_edge", (L + 0.2, 2.4, 0.06), (0, 0, 2.6), TEAL, 0.01)
for x in (-L / 4, L / 4):
box("bench", (1.8, 0.45, 0.08), (x, 0.4, 0.5), WOOD, 0.01)
for sx in (-1, 1):
box("bleg", (0.08, 0.4, 0.5), (x + sx * 0.75, 0.4, 0.25), INK, 0.0)
box("psign", (2.2, 0.1, 0.55), (0, 0.9, 2.15), mat("psign", (0.15, 0.35, 0.6)), 0.01)
export(os.path.join(OUT, "platform.glb"))
footbridge()
platform()
print("hero: batch 3 built")