extends SceneTree const MINIMUM_DURATION_SECONDS := 20.0 const MAXIMUM_DURATION_SECONDS := 30.0 const HARD_TIMEOUT_SECONDS := 36.0 var completed := false var failed_reason := "" func _initialize() -> void: call_deferred("_run") func _run() -> void: var main_scene: Node = load("res://main.tscn").instantiate() root.add_child(main_scene) await process_frame for _frame in 10: await physics_frame var demo := main_scene.get_node("DemoController") demo.pantry_crisis_completed.connect(_on_demo_completed) demo.pantry_crisis_failed.connect(_on_demo_failed) var started_at := Time.get_ticks_msec() demo.start_pantry_crisis_demo() while not completed and failed_reason.is_empty(): var elapsed := (Time.get_ticks_msec() - started_at) / 1000.0 if elapsed > HARD_TIMEOUT_SECONDS: failed_reason = "Timed out after %.1f seconds" % elapsed break await process_frame var duration := (Time.get_ticks_msec() - started_at) / 1000.0 if not failed_reason.is_empty(): push_error("[TOOL] Pantry crisis demo failed: %s" % failed_reason) quit(1) return if duration < MINIMUM_DURATION_SECONDS or duration > MAXIMUM_DURATION_SECONDS: push_error( ( "[TOOL] Pantry crisis demo took %.1f seconds; expected %.0f–%.0f" % [duration, MINIMUM_DURATION_SECONDS, MAXIMUM_DURATION_SECONDS] ) ) quit(1) return print("[TOOL] Pantry crisis demo completed in %.1f seconds" % duration) quit(0) func _on_demo_completed(_helper_id: int, _resolution_event_id: int) -> void: completed = true func _on_demo_failed(reason: String) -> void: failed_reason = reason