Map 1: rebuild Hollywood as the El Capitan landmark
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped

Replace the generic boulevard facade with a stylized 6840 Hollywood Blvd block: six Ionic columns, eight stone steps, Masonic frieze/medallions, event banners, side doors, El Capitan Theatre and retail neighbours, Ovation Hollywood arcade, Walk of Fame and four-lane street markings.

Add the Day and Night Hollywood venue-menu rows. Night uses a phase-time offset so a full-length shift stays in LATE while the clock starts at zero; late routine traffic keeps the street populated and the offset round-trips through checkpoint restore.

Retune local-light falloff to linear attenuation, add a cool north sky fill, and use the smooth limestone facade texture. Refresh the staged gallery and map references; add geometry-budget, menu, night-offset and late-traffic tests.
This commit is contained in:
zwitschi committed 2026-11-02 12:34:48 +01:00
1 parent 3f335481d6
commit 74dc1fdc1d
50 files changed
+1176 -100

No files matched your search

+13 -2
View File
@@ -24,6 +24,9 @@ var elapsed_s: float = 0.0
## Wall-clock start, so the shift review can show event times as mm:ss.
var started_at_ms: int = 0
var current_phase: int = Rules.Phase.EARLY
## Shift time added when resolving the phase. A night variant starts at 0:00
## elapsed but reads LATE, so its full shift stays after dark.
var phase_offset_s: float = 0.0
var running := false
var event_bus := EventBus.new()
@@ -50,6 +53,8 @@ func setup(p_scenario: VenueScenario, p_duration_s: float = 900.0, p_seed: int =
duration_s = p_duration_s
spawn_seed = p_seed
scheduler.setup(scenario, p_seed)
phase_offset_s = 0.0
current_phase = Rules.Phase.EARLY
event_bus = EventBus.new()
responder_outcomes.clear()
investigations.clear()
@@ -101,17 +106,21 @@ func tick(delta: float) -> void:
func _phase_for_time(t: float) -> int:
if scenario == null or scenario.shift_phases.is_empty():
return Rules.Phase.EARLY
var shifted := t + phase_offset_s
var last_phase := Rules.Phase.EARLY
var keys := scenario.shift_phases.keys()
keys.sort()
for phase in keys:
var start_s: float = scenario.shift_phases[phase].get("start_s", 0.0)
if t >= start_s:
if shifted >= start_s:
last_phase = phase
return last_phase
func schedule_time_s() -> float:
return elapsed_s + phase_offset_s
func _spawn_due(delta: float) -> void:
var due := scheduler.pull_due(elapsed_s, current_phase)
var due := scheduler.pull_due(schedule_time_s(), current_phase)
var fallback := scheduler.fallback_routine_traffic(current_phase)
var all := due
all.append_array(fallback)
@@ -161,6 +170,7 @@ func snapshot() -> Dictionary:
"duration_s": duration_s,
"elapsed_s": elapsed_s,
"current_phase": current_phase,
"phase_offset_s": phase_offset_s,
"spawned_count": spawned_count,
"responder_outcomes": responder_outcomes.duplicate(),
"investigations": investigations.duplicate(),
@@ -175,6 +185,7 @@ func restore(data: Dictionary) -> void:
duration_s = float(data.get("duration_s", duration_s))
elapsed_s = float(data.get("elapsed_s", 0.0))
current_phase = int(data.get("current_phase", Rules.Phase.EARLY))
phase_offset_s = float(data.get("phase_offset_s", 0.0))
spawned_count = int(data.get("spawned_count", 0))
responder_outcomes.clear()
for value in data.get("responder_outcomes", []):