extends SceneTree ## Build every level in Levels.ORDER and report whether it's structurally sound: ## prop count, missing assets, and — the one that matters — whether anything is spawned ## inside anything else. A level that fires furniture across the room on frame one is ## broken whatever it looks like in a screenshot. ## ## Godot --headless --path game --script dev/probe_levels.gd func _initialize() -> void: var main: Node = (load("res://main.tscn") as PackedScene).instantiate() get_root().add_child(main) await process_frame for id in Levels.ORDER: main._load_level(id) for i in 8: await physics_frame var plan = main.get("_plan") var bodies := get_nodes_in_group("smashable").size() var statics := _count_static(plan) # let it run a full second and see if anything is still moving for i in 60: await physics_frame var motion := 0.0 var worst := "" var worst_v := 0.0 for n in get_nodes_in_group("smashable"): var b := n as RigidBody3D if b == null or b.freeze: continue var v := b.linear_velocity.length() motion += v if v > worst_v: worst_v = v worst = "%s at %s" % [b.name, b.global_position.snappedf(0.1)] print("\n=== %-14s %s" % [id, plan.level_name()]) print(" smashables=%-4d static bodies=%-4d" % [bodies, statics]) print(" residual motion after 1s = %.2f m/s worst: %s" % [ motion, worst if worst != "" else "-"]) quit() func _count_static(n: Node) -> int: var c := 0 if n is StaticBody3D: c += 1 for ch in n.get_children(): c += _count_static(ch) return c