Visual polish pass (v0.2.0): phase lighting, street lamps, marquee, dressing, night screenshots

- Phase-based lighting: sun direction/energy/color, ProceduralSkyMaterial
  gradient, and ambient per shift phase (GameManager.PHASE_LIGHTING),
  applied on phase transitions and shift start
- WorldBuilder: street lamp poles with emissive bulbs + OmniLights,
  set_night_mode(), glowing STEP LINE marquee (Label3D + emissive bars),
  crosswalk stripes, planters, low-poly street trees
- NPC avatars: per-seed height/brightness variation (deterministic LCG)
- Denser routine traffic probabilities
- capture_screenshots.gd: fast-forward to LATE phase and capture night set;
  README gallery is now 2x3 day+night; docs/screenshots regenerated
- Version bumped to 0.2.0; build/ artifacts rebuilt; Linux binary smoke-tested
- New headless tests for phased lighting config and street dressing (56 total)
This commit is contained in:
zwitschi committed 2026-10-31 13:24:40 +01:00
1 parent 93883334d0
commit 513f8a0f60
21 files changed
+280 -25

No files matched your search

+10
View File
@@ -41,6 +41,7 @@ func get_npc_controller() -> NPCController:
func setup(profile: NpcProfile, intent: String, seed_value: int, p_spawn: Vector3, p_target: Vector3, p_door: Vector3 = Vector3(0, 0.5, 1.2)) -> void:
npc.setup("npc_%d" % seed_value, profile, intent, seed_value)
_visual_seed = seed_value
spawn_position = p_spawn
target_position = p_target
door_position = p_door
@@ -66,6 +67,8 @@ func setup(profile: NpcProfile, intent: String, seed_value: int, p_spawn: Vector
collider.position = Vector3(0, 0.8, 0)
add_child(collider)
var _visual_seed := 0
func _build_body(npc_type: int) -> void:
var body := MeshInstance3D.new()
var capsule := CapsuleMesh.new()
@@ -74,6 +77,13 @@ func _build_body(npc_type: int) -> void:
body.mesh = capsule
var mat := StandardMaterial3D.new()
mat.albedo_color = TYPE_COLORS.get(npc_type, Color(0.7, 0.7, 0.7))
# Per-seed variation: slight height and brightness differences so crowds
# read as individuals (deterministic LCG, no RNG side effects).
var frac := float((_visual_seed * 1103515245 + 12345) % 1000) / 1000.0
var height_scale := 0.9 + 0.2 * frac
body.scale = Vector3(1.0, height_scale, 1.0)
body.position.y = (height_scale - 1.0) * 0.8
mat.albedo_color = mat.albedo_color.lightened(0.15 * frac) if frac < 0.5 else mat.albedo_color.darkened(0.15 * (1.0 - frac))
body.material_override = mat
add_child(body)
var id_tag := MeshInstance3D.new()